我有一个用于UITableView的自定义UITableCell,上面有一个按钮。
我使用以下代码使用此代码检测单元格的indexPath并传递索引,以便可以对单元格的视图控制器执行适当的操作。
这在iOS 11及更高版本上运行良好,但在ios11及更高版本下不起作用。请帮助我理解为什么会发生这种情况,以及如何避免这种错误。我受够了。非常感谢你的帮助。谢谢。
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中调用(如@vadian a tIssue Detecting Button cellForRowAt所建议)。我已经删除了单元格,而且由于cellForRow并没有每次刷新,一些单元格仍然保存了最后一个索引,这会导致错误。请帮我找到解决办法。
最佳答案
最主要的问题是,假设单元格的超视图是表视图是不恰当的。不要假设视图类的私有子视图结构是由您以外的人提供的。
第二个问题是,您在cell类中放入了太多逻辑。单元格的委托只需将自身(单元格)作为唯一参数传递给委托方法。让委托的实现者获得它所需要的有关单元格的任何信息。如果委托想要知道单元格的索引路径,那么委托可以询问表视图。这个逻辑不属于单元。
单元不应该需要知道它自己的索引路径,也不应该知道它在哪个表视图中。一个细胞应该只关心它自己的观点,而不是别的。
更新协议方法以将单元格作为参数。
更新单元格的按钮处理程序,以便将自身作为参数传递给委托方法。
更新视图控制器中的delegate方法,以单元格作为参数,并基于该单元格获取所需的任何内容。
这样做可以使cell类的实现简单得多,并将其所属的逻辑放在视图控制器中。