如何从UITableViewCell类引用UITableViewController?

问题描述 投票:36回答:6

我有以下内容:

  1. UITableViewController
  2. UITableView
  3. 自定义UITableViewCell子类

我为该单元格使用了一个.xib文件,它是一个CustomCell子类。此自定义单元为单元按钮上的某些触摸事件处理IBAction。

我想从单元格中引用ViewController及其一些变量。

我应该如何从UITableViewCell类访问UITableViewController?

ios cocoa-touch uitableview swift uikit
6个回答
53
投票

我不会在单元格和视图控制器之间创建这种依赖关系-这会使体系结构更加复杂,并且单元格不可重用。

我建议您使用委派模式,这听起来可能有点复杂-尽管您已经在使用(UITableViewDelegate是典型示例:]

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

[此时,在单元格中轻按时,将调用视图控制器的didTapCell方法,然后您就可以执行所需的任何操作。

关键是:不要让单元处理单元的轻击/选择,而是通知视图控制器并让它完成工作。


22
投票
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)
}

14
投票

我不认为您应该这样做,并且可能您做错了什么,但是如果您确实需要它,则只需在CustomCell类中有一个属性。

weak var viewController : UIViewController

然后在cellForRowAtIndexPath中创建单元格时,设置属性

cell.viewController = self

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

self.viewController.doSomething()

但是同样,我认为您应该重新设计代码。单元不应在意控制器。它应该只关心显示自己,而不关心其他任何东西


4
投票

添加扩展名

 extension UITableViewCell {

        var viewControllerForTableView : UIViewController?{
            return ((self.superview as? UITableView)?.delegate as? UIViewController)
        }

    }

现在降如下所示

   if let viewController = self.viewControllerForTableView as? AnyController{

       print(viewController.variable)

   } 


2
投票

最好的方法是实施委派。您的代表将通知按钮单击有关的视图控制器。并且,您的视图控制器(符合上述委托的协议)将处理您要在click事件上执行的任务。 (委托模式教程可在线获得。如果您想了解如何进行委托,可以遍历它们。)>


0
投票

尝试使用此方法之前,请先阅读其他有关确实要使用替代方法的注释,但是使用此扩展名将使您可以同时进入dataSourcedelegate,这两个都应为UITableViewController

© www.soinside.com 2019 - 2024. All rights reserved.