Nor*_*ias 36 cocoa-touch uitableview uikit ios swift
我有以下内容
我使用NIB(.xib文件)作为单元格,它使用CustomCell类.此自定义单元格类处理IBAction以触摸单元格的按钮.我想引用ViewController及其中的一些变量.我该怎么做(访问ViewController)?
谢谢!
Ant*_*nio 53
我不会在单元格和视图控制器之间创建这种依赖关系 - 这会使架构更复杂,并且单元格不可重用.
我建议你使用委托模式,这可能听起来有点复杂 - 虽然你已经在使用(UITableViewDelegate
是一个典型的例子):
MyCellProtocol
使用一种方法创建协议didTapCell
,接受UITableViewCell
要传递给视图控制器的一个和/或一些自定义数据weak var cellDelegate: MyCellProtocol?
didTapXXX
处理程序或didSelectRowAtIndexPath
您的单元格中,调用self.cellDelegate?.didTapCell()
,传递预期的参数MyCellProtocol
cellForRowAtIndexPath
视图控制器中,在创建/出列单元格时,将其cellDelegate
属性设置为self
此时,当您在单元格中完成点击时,将didTapCell
调用视图控制器的方法,然后您可以执行任何操作.
关键点在于:不是让单元格处理单元格点击/选择,而是通知视图控制器并让它完成工作.
Bla*_*ank 21
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
}
}
Run Code Online (Sandbox Code Playgroud)
你的牢房里面
if let myViewController = parentViewController as? MyViewController {
print(myViewController.title)
}
Run Code Online (Sandbox Code Playgroud)
And*_*kha 14
我不认为你应该这样做,可能你做错了但如果你真的需要它,那么你的CustomCell
班级就有了一个属性.
weak var viewController : UIViewController
Run Code Online (Sandbox Code Playgroud)
然后在cellForRowAtIndexPath
设置属性时创建单元格
cell.viewController = self
Run Code Online (Sandbox Code Playgroud)
之后,您可以从单元格代码中轻松访问视图控制器:
self.viewController.doSomething()
Run Code Online (Sandbox Code Playgroud)
但是,在我看来,你应该重新设计你的代码.单元格不应该关心控制器.它应该只关心自己展示而不是其他
add Extension
extension UITableViewCell {
var viewControllerForTableView : UIViewController?{
return ((self.superview as? UITableView)?.delegate as? UIViewController)
}
}
Run Code Online (Sandbox Code Playgroud)
now downCast as below
if let viewController = self.viewControllerForTableView as? AnyController{
print(viewController.variable)
}
Run Code Online (Sandbox Code Playgroud)
.
归档时间: |
|
查看次数: |
28588 次 |
最近记录: |