在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类型。本示例旨在说明一个要点。您可能希望使用协议对其进行清理。