我有一个自定义的UITableView UITableCell,上面有一个按钮。
我使用以下代码使用此代码检测单元格的indexPath并传递索引,以便我可以在单元格的View Controller上采取适当的操作。
此功能在iOS 11及更高版本上正常运行,但在iOS 11及更高版本上不起作用。请帮助我了解为什么会发生这种情况以及如何避免此错误。我对此深感困惑。非常感谢您的帮助。谢谢。
class PostCellView: UITableViewCell {
weak var delegate: PostCellViewDelegate?
// utilities
@IBAction func cellAction(_ sender: UIButton) {
let tableView : UITableView = self.superview as! UITableView
let indexPath: IndexPath = tableView.indexPathForRow(at: self.center)!
delegate?.cellTaskerAction(row : indexPath.row)
}
}
我不能在cellForRow中设置的自定义单元格中使用回调闭包,并且在自定义单元格的IBAction中调用它(如Issue Detecting Button cellForRowAt的@vadian建议)。我删除了单元格,并且因为cellForRow并非每次都刷新,所以某些单元格仍保存了最后一个索引,这会导致错误。请帮助我找到解决方案。
答案 0 :(得分:0)
主要问题是您不恰当地假设单元格的超级视图是表视图。切勿对除您以外的人提供的视图类的私有子视图结构做任何假设。
第二个问题是您在单元格类中放置了太多的逻辑。您单元的委托应该简单地将自身(单元)作为唯一方法传递给委托方法。让委托的实现者获得有关单元的任何信息。如果委托人想知道单元格的索引路径,则委托人可以询问表视图。此逻辑不属于该单元格。
一个单元永远不需要知道它自己的索引路径或它所在的表视图。一个单元应该只关心它自己的视图,而不关心其他任何东西。
更新协议方法以将单元格作为参数。
更新单元格的按钮处理程序,以简单地将自身作为参数传递给委托方法。
在视图控制器中更新委托方法以将单元格作为参数,并基于该单元格获取所需的内容。
这样做使单元类的实现更加简单,并将其所属的逻辑放在视图控制器中。