在UIViewController(splitviewcontroller的详细视图)中按下UIButton将打开UITableViewController,以弹出框的形式呈现。这是通过segue完成的,并且在属性检查器中将“种类”设置为“作为弹出窗口呈现”。当选择了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 / presentingview。阅读了有关弹出窗口的内容后,我觉得我应该在某处实现一个委托和委托方法。但是我不敢打扰,怎么做。

正确的方法是什么?

最佳答案

您可能要使用委托设计模式。如果我正确了解您的情况,则可以执行以下操作:

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类型。

本示例旨在说明一个要点。您可能希望使用协议对其进行清理。

10-08 06:04
查看更多