如何从Swift中的uitableviewcell类引用控制器

我有以下

  1. 视图控制器
  2. 的tableView
  3. CustomCell

我使用了一个NIB(一个.xib文件)的单元格,它使用一个CustomCell类。 这个自定义的单元类处理IBAction的一些触摸单元格的button。 我想引用ViewController及其中的一些variables。 我应该怎么做(访问ViewController)?

谢谢!

我不会在单元和视图控制器之间创build这种依赖关系 – 这使得架构更复杂,单元不可重用。

我build议你使用委托模式,虽然你已经在使用( UITableViewDelegate是一个典型的例子),但听起来有点复杂:

  • 用一个方法didTapCell创build一个协议MyCellProtocol ,接受一个UITableViewCell和/或一些你想传递给视图控制器的自定义数据
  • 在你的自定义单元格中创build一个公共委托属性: var cellDelegate: MyCellProtocol?
  • 在你的单元的didTapXXX处理程序或didSelectRowAtIndexPath中,调用self.cellDelegate?.didTapCell() ,传递期望的参数
  • 在你的视图控制器中,实现MyCellProtocol
  • 在视图控制器的cellForRowAtIndexPath中,当创build/出队单元格时,将其cellDelegate属性设置为self

在这个时候,当你的单元格完成一个tap时,视图控制器的didTapCell方法被调用,从那里你可以做任何你需要做的事情。

关键是:而不是让单元格处理单元格点击/select,通知视图控制器,让它做这项工作。

 extension UIView { var parentViewController: UIViewController? { var parentResponder: UIResponder? = self while parentResponder != nil { parentResponder = parentResponder!.nextResponder() if let viewController = parentResponder as? UIViewController { return viewController } } return nil } } 

在你的手机里面

 if let myViewController = parentViewController as? MyViewController { print(myViewController.title) } 

我不认为你应该这样做,也许你做错了,但如果你真的需要它,那么只需在你的CustomCell类中有一个属性。

 var viewController : UIViewController 

那么当你在cellForRowAtIndexPath创build单元格的时候设置属性

 cell.viewController = self 

之后,您可以轻松访问单元格代码内的视图控制器:

 self.viewController.doSomething() 

但是,在我看来,你应该重新devise你的代码。 电池不应该关心控制器。 它应该只关心展示自己,而不是别的

最好的办法是实施授权。 您的代表将通知视图控制器有关button单击。 而且,你的视图控制器(谁是符合上述委托的协议)将处理你想要执行的单击事件的任务。 (委托模式的教程可以在线获得,如果你想知道如何委派的话,可以通过它们)。

阅读其他意见之前,真的想在尝试使用替代方法之前,但使用此扩展将允许您到达dataSourcedelegate两者应该是UITableViewController

 extension UITableViewCell { var tableView:UITableView? { get { for var view = self.superview ; view != nil ; view = view!.superview { if view! is UITableView { return (view! as UITableView) } } return nil } } var tableViewDataSource:UITableViewDataSource? { get { return self.tableView?.dataSource } } var tableViewDelegate:UITableViewDelegate? { get { return self.tableView?.delegate } } }