【问题标题】:How to access parent view controller from popover in swift, using storyboard如何使用情节提要快速从弹出窗口访问父视图控制器
【发布时间】:2016-04-28 20:21:42
【问题描述】:

在 UIViewController(splitviewcontroller 的详细视图)中推送 UIButton 会打开 UITableViewController,显示为弹出框。这是通过 segue 完成的,并且“kind”在属性检查器中设置为“Present as 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”,表明我未能捕获父视图/呈现视图。在阅读了弹出框之后,我觉得我应该在某个地方实现一个委托和委托方法。但我无法低估以及如何。

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

【问题讨论】:

  • 就这样吧,,, MYViewController.Variable = cell.someProperty..
  • 感谢您的建议,但这不起作用。

标签: swift uitableview interface-builder popover


【解决方案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。

此示例旨在显示一个点。您可能希望使用协议来清理它。

【讨论】:

  • 谢谢。这似乎是使用 NSNotification 的一个很好的替代品,并且可能会解决我遇到的很多麻烦。但是,我无法收回财产。在 func myTableViewController(viewController: MyTableViewController, didSelectCellWithProperty property: Int) { // ... } 中添加 "print (property)" print("Hi") 不会打印任何内容,就像从未调用过该方法一样。
  • 也许我理解错了.. 你是想将单元格的属性发送到 MyViewController 吗?
  • 是的,或者任何来自 tableviewcontroller 的属性。
  • 如果您将该属性作为参数传递给委托,它应该可以工作。也许您忘记将 MyViewController 设置为委托?如果在委托方法中设置断点会发生什么?
  • 见我上面的编辑。您需要设置您创建的特定委托属性。如果你愿意,你可以冷命名这个 .delegate,我只是认为这对于这个例子来说会更清楚。另外,请记住,您正在设置 viewController 的委托,而不是 tableView
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 2014-06-16
  • 2013-05-23
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多