Swift:从UICollectionViewCell

时间:2017-02-28 16:17:00

标签: swift uiviewcontroller uinavigationcontroller uicollectionview uicollectionviewcell

我有一个UICollectionViewCell类" ProductCell &#34 ;;我正在尝试访问当前的导航控制器以更新barbuttonicon。我尝试了以下代码,因为这是我在其他UIViewControllers中使用的代码:

    let nav = self.navigationController as! MFNavigationController
    nav.updateCartBadgeValue()

然而它说明了

  

类型的值ProductCell没有成员navigationController

我知道这不是UIViewController但你肯定能以同样的方式访问当前的导航控制器吗?

我也知道您可以通过以下方式使用UIApplication来访问导航控制器:

let navigationController = application.windows[0].rootViewController as! UINavigationController

我不确定这是否是一种很好的方式。

非常感谢任何帮助

由于

3 个答案:

答案 0 :(得分:1)

UIResponder链将在这里提供帮助。

您可以搜索响应者链以查找任何视图的控制器

extension UIView {

    func controller() -> UIViewController? {
        if let nextViewControllerResponder = next as? UIViewController {
            return nextViewControllerResponder
        }
        else if let nextViewResponder = next as? UIView {
            return nextViewResponder.controller()
        }
        else  {
            return nil
        }
    }

    func navigationController() -> UINavigationController? {
        if let controller = controller() {
            return controller.navigationController
        }
        else {
            return nil
        }
    }
}

controller()将返回类型为UIViewController的最近响应者 然后在返回的控制器上,您只需找到其导航控制器。您可以在此处使用navigationController()

答案 1 :(得分:0)

除非事情发生变化,否则这是一个很好的方法。为了给你一个更简洁的解决方案的例子......你可以添加一个

let hostViewController:UIViewController 

属性到您的单元格并添加初始化程序来处理它

let cell = ProductCell(vc: self)

但我认为这不是一个更好的方法。你的建议很好。

let navigationController = application.windows[0].rootViewController as! UINavigationController

答案 2 :(得分:0)

最简单的方法是向您的单元类添加一个弱引用UINavigationController的属性

weak var navigationController: UINavigationController?

您需要在cellForRow(atIndexPath:_)方法中分配它。

let cell = tableView.dequeueReusableCell(withIdentifier: "yourReuseID") as! YourCellClass
cell.navigationController = navigationController //will assign your viewController's navigation controller to the cell

return cell