【问题标题】:How to pass data to parent view controller如何将数据传递给父视图控制器
【发布时间】:2019-12-28 02:32:42
【问题描述】:

单击图像时,我正在对我的父 VC 执行 segue。我想将数据从子 VC 传递回父 VC。我一直在探索将数据传递回父 VC 的各种选项,但无法弄清楚。

由于子 VC 是 Navigation 的一部分,并且通过 segue 呈现(显示),因此应该有一种简单的方法将数据传回父级。

怎么做?

我尝试了viewWillDisappear 方法,但 parentVC 在以下代码中为零。

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if self.isMovingFromParent {
        if let navVC = self.presentingViewController as? UINavigationController {
            if let parentVC = navVC.viewControllers.first as? ParentViewController {
                print("viewWillDisappear() moving to parent") // Not executed
                parentVC.data = self.data
            }
        }
    }
}

【问题讨论】:

    标签: ios swift uinavigationcontroller segue viewwilldisappear


    【解决方案1】:

    一种策略是将父级设置为子级的代表。您可以在 prepare(for:sender:) 函数中创建这种关系。

    如果你不熟悉委托,这篇文章是一个很好的指南:https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef

    【讨论】:

    • 我知道委托,我可以让它与委托一起工作,但这似乎不是一个优雅的解决方案。想象一下,如果您从一个视图进行 10 次 segues,您最终将编写大量代码来处理这些委托。使用导航堆栈/segue 控件属性来传递数据不是更简单的方法吗?
    • 不需要太多代码。只需检查 segueID 并将父级分配给子级。最多 3 行代码使用导航堆栈是对您将在该堆栈中找到的内容做出一些假设。每次您需要发回信息时,您都必须检查堆栈,然后查看它是否适合将数据发回。我会选择委托方法。
    【解决方案2】:

    使用委托将数据发送回父级。

    【讨论】:

      【解决方案3】:

      您可以使用 3 种方法将数据从子 ViewController 分配回父 ViewController,如前面的回答中所述,您可以使用委托或闭包,但因为您不想处理

      如果 segue.identifier == "segueIdentifier"

      然后您可以使用通知,在父视图中创建观察者,然后在子视图控制器中发布。 在父

      override func viewDidLoad(){
       NotificationCenter.default.addObserver(self, selector: #selector("yourSelectorName"), name: "NotificationName", object: nil)
      

      并在子帖子中使用此内容。

      NotificationCenter.default.post(name: "notificationName", object: nil, userInfo: ["your data array "])
      

      如果通知名称不是字符串,则必须为其创建名称,并且可以在 userInfo 中传递或不传递数据。

      【讨论】:

        【解决方案4】:

        Swift 5、Xcode 10.3

        使用以下任意一种方法

        1.通过self.navigationController.viewControllers访问parentVC的引用,然后使用该引用访问变量和设置数据

        2.你可以使用 unwind segue

        3.使用委托协议

        如果您需要更多详细信息,请参阅 https://stackoverflow.com/a/9736559/10579134

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 2020-04-01
          • 2021-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多