我有以下内容:
我为该单元格使用了一个.xib文件,它是一个CustomCell
子类。此自定义单元为单元按钮上的某些触摸事件处理IBAction。
我想从单元格中引用ViewController及其一些变量。
我应该如何从UITableViewCell类访问UITableViewController?
我不会在单元格和视图控制器之间创建这种依赖关系-这会使体系结构更加复杂,并且单元格不可重用。
我建议您使用委派模式,这听起来可能有点复杂-尽管您已经在使用(UITableViewDelegate
是典型示例:]
MyCellProtocol
创建一个协议didTapCell
,接受要传递给视图控制器的UITableViewCell
和/或一些自定义数据weak var cellDelegate: MyCellProtocol?
didTapXXX
处理程序或didSelectRowAtIndexPath
中,调用self.cellDelegate?.didTapCell()
,并传递期望的参数MyCellProtocol
cellForRowAtIndexPath
中,在创建/出单元格时,将其cellDelegate
属性设置为self
[此时,在单元格中轻按时,将调用视图控制器的didTapCell
方法,然后您就可以执行所需的任何操作。
关键是:不要让单元处理单元的轻击/选择,而是通知视图控制器并让它完成工作。
extension UIView {
var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
在您的牢房内
if let myViewController = parentViewController as? MyViewController {
print(myViewController.title)
}
我不认为您应该这样做,并且可能您做错了什么,但是如果您确实需要它,则只需在CustomCell
类中有一个属性。
weak var viewController : UIViewController
然后在cellForRowAtIndexPath
中创建单元格时,设置属性
cell.viewController = self
之后,您可以轻松地从单元格代码中访问视图控制器:
self.viewController.doSomething()
但是同样,我认为您应该重新设计代码。单元不应在意控制器。它应该只关心显示自己,而不关心其他任何东西
添加扩展名
extension UITableViewCell {
var viewControllerForTableView : UIViewController?{
return ((self.superview as? UITableView)?.delegate as? UIViewController)
}
}
现在降如下所示
if let viewController = self.viewControllerForTableView as? AnyController{
print(viewController.variable)
}
。
最好的方法是实施委派。您的代表将通知按钮单击有关的视图控制器。并且,您的视图控制器(符合上述委托的协议)将处理您要在click事件上执行的任务。 (委托模式教程可在线获得。如果您想了解如何进行委托,可以遍历它们。)>
尝试使用此方法之前,请先阅读其他有关确实要使用替代方法的注释,但是使用此扩展名将使您可以同时进入dataSource
和delegate
,这两个都应为UITableViewController