如何将视图 TableViewCell 转换为 UIGestureView
Posted
技术标签:
【中文标题】如何将视图 TableViewCell 转换为 UIGestureView【英文标题】:How to cast view TableViewCell to UIGestureView 【发布时间】:2018-02-16 01:28:30 【问题描述】:我正在尝试在手势视图点击上更改我的表格视图单元格内容,但是我收到了错误
线程 1:信号 SIGABRT
无法将“UILabel”(0x117f4ad68) 类型的值转换为“MyApplication.Read”
func ReadAnswer(_ sender: UIGestureRecognizer)
let CellIndex = sender.view?.tag
print(CellIndex!)
let test = sender.view as! Read! // This produces error
test?.comment.text = "You have clicked on cell \(CellIndex)"
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let mycell = tableView.dequeueReusableCell(withIdentifier: "Read", for: indexPath) as! Read
mycell.comment.tag = indexPath.row
mycell.comment.text = streamsModel.Posts[indexPath.row]
let Gesture = UITapGestureRecognizer(target: self, action: #selector(ReadAnswer(_:)))
Gesture.delegate = self as? UIGestureRecognizerDelegate
mycell.comment.addGestureRecognizer(Gesture)
return cell
再次单击标签我想更改该标签的内容,以说明您已单击单元格 (CellIndex) 。我可以在每次点击时获得正确的索引,但是在 Let Test 上会出现错误。
【问题讨论】:
【参考方案1】:你被添加到Gesture
到UILabel
..!! comment
是 UILabel
。
let Gesture = UITapGestureRecognizer(target: self, action: #selector(ReadAnswer(_:)))
Gesture.delegate = self as? UIGestureRecognizerDelegate
mycell.comment.addGestureRecognizer(Gesture)
在Gesture Action
中,sender.view 应该是 UILabel。所以发生了以下错误。
无法将“UILabel”(0x117f4ad68) 类型的值转换为“MyApplication.Read”
func ReadAnswer(_ sender: UIGestureRecognizer)
let CellIndex = sender.view?.tag
print(CellIndex!)
let test = sender.view as! Read! // This produces error
test?.comment.text = "You have clicked on cell \(CellIndex)"
解决
我们必须为此使用字典。因此,我们可以避免 tableView 重用。你可以得到我的answer UIStepper。同理如下。
var textDict = [Int : String]()
override func viewDidLoad()
super.viewDidLoad()
for i in 0..<70 // numberOfRows
textDict[i] = "Hello"
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 70
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "table", for: indexPath) as! TblTableViewCell
let Gesture = UITapGestureRecognizer(target: self, action: #selector(ReadAnswer))
Gesture.delegate = self as? UIGestureRecognizerDelegate
cell.commentLbl.tag = indexPath.row
cell.commentLbl.isUserInteractionEnabled = true
cell.commentLbl.addGestureRecognizer(Gesture)
cell.commentLbl.text = textDict[indexPath.row]
return cell
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 50
@objc func ReadAnswer(_ sender: UIGestureRecognizer)
let CellIndex : Int = (sender.view?.tag)!
textDict[CellIndex] = "You have clicked on cell \(CellIndex)"
tblView.reloadData()
【讨论】:
【参考方案2】:一些背景要点:不要在每次添加单元格时添加手势识别器。随着您的细胞被回收,您将获得越来越多的手势识别器。向您的自定义单元类添加一个标志,告知您是否已经添加了手势识别器,并且仅在您尚未添加时添加一个。
(不会阻止您的代码工作,但仍然很重要)。 Swift 中的方法名和变量名应该以小写字母开头。类和类型名称应以大写字母开头。
至于你的强制施法失败的原因,听起来你单元的mycell.comment
出口不是所需的类型Read
。根据错误,它的类型为UILabel
,而不是Read
(不管是什么)。但是,您没有给我们足够的信息来帮助我们解决这部分问题。您需要说明您是如何设置我的班级的插座的,还需要说明Read
类型是什么。
【讨论】:
【参考方案3】:在您的ReadAnswer
函数中,sender
引用了它所附加到的视图。该视图是您命名为comment
的UILabel
。
改变你的功能如下:
func ReadAnswer(_ sender: UIGestureRecognizer)
let CellIndex = sender.view?.tag
print(CellIndex!)
if let test = sender.view as? UILabel
test.comment.text = "You have clicked on cell \(CellIndex)"
【讨论】:
【参考方案4】:这是我刚刚写的测试答案
我的数组
var staticArrayy = ["1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"]
我的 tableview 委托
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return staticArrayy.count
//Setting cells data
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = self.myDemoTableView.dequeueReusableCell(withIdentifier: "Cell") as! CustomTableViewCell
///Adding Gesture
let Gesture : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tableViewVC.ReadAnswer(_:)))
Gesture.numberOfTapsRequired = 1
Gesture.cancelsTouchesInView = false
Gesture.delegate = self
cell.comment.addGestureRecognizer(Gesture)
cell.comment.isUserInteractionEnabled = true
///Assuming mycell.comment.text is a Label Connected
cell.comment.text = staticArrayy[indexPath.row]
return cell
//Setting height of cells
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 60
点击手势处理程序
@objc func ReadAnswer(_ sender: UITapGestureRecognizer)
//Get position in View
let myPosition = sender.location(in: self.myDemoTableView)
//Get current Index Path
let indexPath : IndexPath = self.myDemoTableView.indexPathForRow(at: myPosition)!
//Time to Show Answer
var cell = self.myDemoTableView.dequeueReusableCell(withIdentifier: "Cell") as! CustomTableViewCell
cell = self.myDemoTableView.cellForRow(at: indexPath) as! CustomTableViewCell
cell.comment.text = "You have clicked on cell \(indexPath.row)"
//Re-Deque issue
//Update the Array Content at same Index whose value is changed
self.staticArrayy[indexPath.row] = cell.comment.text!
我的细胞类
import UIKit
class CustomTableViewCell: UITableViewCell
@IBOutlet weak var comment: UILabel!
override func awakeFromNib()
super.awakeFromNib()
// Initialization code
override func setSelected(_ selected: Bool, animated: Bool)
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
输出:
tableView 第一次加载时
当点击 TableView 单元格时
【讨论】:
你可以添加超过 30 个单元格并检查吗?是不是重用? 同样,你能解释一下吗,我最多可以添加 30 行接下来要做什么? 点击第 1 行,更改标签文本,然后滚动到底部,是否看到任何差异? 好的,我遇到了 Re-Deque 问题,解决了检查更新的答案,感谢您提供的信息,例如,我错过了这样做 现在,请检查我的答案。两者是相同的,以上是关于如何将视图 TableViewCell 转换为 UIGestureView的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个 TableViewcell 的不同部分有不同的图像,将集合视图放置在 tableviewCell 内
单击tableview标题按钮时如何将tableviewcell内的collectionview中的数据显示到另一个视图控制器