我有以下
我使用NIB(.xib文件)作为单元格,它使用CustomCell类。此自定义单元格类处理IBAction,以便在单元格的按钮上进行一些触摸。我想引用ViewController及其中的一些变量。我该怎么做(访问ViewController)?
谢谢!
答案 0 :(得分:44)
我不会在单元格和视图控制器之间创建这种依赖关系 - 这会使架构更复杂,并且单元格不可重用。
我建议您使用委托模式,这可能听起来有点复杂 - 虽然您已经在使用(UITableViewDelegate
是一个典型示例):
MyCellProtocol
创建协议didTapCell
,接受UITableViewCell
和/或要传递给视图控制器的某些自定义数据weak var cellDelegate: MyCellProtocol?
didTapXXX
处理程序或didSelectRowAtIndexPath
中,调用self.cellDelegate?.didTapCell()
,传递预期参数MyCellProtocol
cellForRowAtIndexPath
中cellDelegate
属性设置为self
此时,当您的单元格中完成点击时,将调用视图控制器的didTapCell
方法,然后您可以执行任何操作。
关键是:不是让单元格处理单元格点击/选择,而是通知视图控制器让它完成工作。
答案 1 :(得分:19)
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
}
}
Inside your cell
if let myViewController = parentViewController as? MyViewController {
print(myViewController.title)
}
答案 2 :(得分:11)
我认为你不应该这样做,可能你做错了但是如果你真的需要它,那么你的CustomCell
课程中就有了一个属性。
var viewController : UIViewController
然后在cellForRowAtIndexPath
中创建单元格时设置属性
cell.viewController = self
之后,您可以从单元格代码中轻松访问视图控制器:
self.viewController.doSomething()
但是,在我看来,你应该重新设计你的代码。单元格不应该关心控制器。它应该只关心显示自己而不是其他什么
答案 3 :(得分:2)
最好的办法是实施代表团。您的代表将通知视图控制器有关按钮单击的信息。而且,您的视图控制器(符合上述委托的协议)将处理您要对点击事件执行的任务。 (可以在线获取授权模式教程。如果您想知道如何进行授权,可以查看它们。)
答案 4 :(得分:2)
添加扩展程序
extension UITableViewCell {
var viewControllerForTableView : UIViewController?{
return ((self.superview as? UITableView)?.delegate as? UIViewController)
}
}
现在downCast如下
if let viewController = self.viewControllerForTableView as? AnyController{
print(viewController.variable)
}
。
答案 5 :(得分:0)
在尝试此操作之前,请阅读其他有关真正想要使用备用方法的评论,但使用此扩展程序可以让您转到dataSource
和delegate
这两者应该是{{1 }}
UITableViewController