在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方法。但我没有说明如何。
这样做的正确方法是什么?
答案 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。
这个例子旨在表明一个观点。您可能希望使用协议来清理它。