如何使用storyboard从swift中的popover访问父视图控制器

时间:2016-04-28 20:21:42

标签: swift uitableview interface-builder popover

在UIViewController中推送UIButton(splitviewcontroller的详细视图)打开一个UITableViewController,以弹出形式呈现。这是通过segue和"种类来实现的。被设置为"呈现为Popover"在属性检查器中。当选择UITableViewController中的UITableViewCell时,我希望UIViewController捕获此选择。

这就是我在UITableViewController中尝试做的事情:

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        let cell = tableView.cellForRowAtIndexPath(indexPath)
        let myViewController = presentingViewController as! MyViewController

        myViewController.variable = cell.someProperty
        self.dismissViewControllerAnimated(true, completion: nil)
    }

这在日志中给出:"致命错误:在展开可选值"时意外发现nil,表示我未能捕获parentview / presentationview。在阅读了有关弹出窗口的内容后,我觉得我应该实现一个委托并委托somwhere方法。但我没有说明如何。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您可能想要使用委托设计模式。如果我理解你的情况,你可以通过以下方式来实现:

class MyTableViewController: UITableViewController {
    // ...

    weak var myViewControllerDelegate: MyViewController? // Make sure it's weak! .. or you know what you're doing, haha

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // ...
        let property = 5 // cell.property
        self.myViewControllerDelegate?.myTableViewController(self, didSelectCellWithProperty: property)
    }
}

class MyViewController: UIViewController {
    // ...

    // In viewDidLoad or elsewhere, if necessary
    override func viewDidLoad() {
        super.viewDidLoad()
        //...

        myTableVCInstance.myViewControllerDelegate = self // This will set the delegate we created to self
    }

    func myTableViewController(viewController: MyTableViewController, didSelectCellWithProperty property: Int) {
        // ...
    }
}

请注意myViewControllerDelegate的命名,以免与UITableViewController已有的delegate发生冲突,其类型为UITableControllerDelegate。

这个例子旨在表明一个观点。您可能希望使用协议来清理它。