在iOS 11以下无法将类型“ UITableViewWrapperView”的值转换为“ UITableView”

时间:2018-10-25 14:38:55

标签: ios swift uitableview

我有一个自定义的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并非每次都刷新,所以某些单元格仍保存了最后一个索引,这会导致错误。请帮助我找到解决方案。

1 个答案:

答案 0 :(得分:0)

主要问题是您不恰当地假设单元格的超级视图是表视图。切勿对除您以外的人提供的视图类的私有子视图结构做任何假设。

第二个问题是您在单元格类中放置了太多的逻辑。您单元的委托应该简单地将自身(单元)作为唯一方法传递给委托方法。让委托的实现者获得有关单元的任何信息。如果委托人想知道单元格的索引路径,则委托人可以询问表视图。此逻辑不属于该单元格。

一个单元永远不需要知道它自己的索引路径或它所在的表视图。一个单元应该只关心它自己的视图,而不关心其他任何东西。

更新协议方法以将单元格作为参数。

更新单元格的按钮处理程序,以简单地将自身作为参数传递给委托方法。

在视图控制器中更新委托方法以将单元格作为参数,并基于该单元格获取所需的内容。

这样做使单元类的实现更加简单,并将其所属的逻辑放在视图控制器中。