如何从Swift中的uitableviewcell类引用控制器
我有以下
- 视图控制器
- 的tableView
- 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单击。 而且,你的视图控制器(谁是符合上述委托的协议)将处理你想要执行的单击事件的任务。 (委托模式的教程可以在线获得,如果你想知道如何委派的话,可以通过它们)。
阅读其他意见之前,真的想在尝试使用替代方法之前,但使用此扩展将允许您到达dataSource
和delegate
两者应该是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 } } }