如何在布局类似于叉子的 UIViewController 之间导航和传递数据?

How to navigate and pass data between UIViewControllers whose layout resembles a fork?

我有几个 UIViewControllers 如图所示

我想要的是将数据 从 B 传递到 C 并进行转换。到目前为止,我已经提出了 2 种可能的解决方案:

  1. 创建 C UIViewController class 的新实例(并在其中保存数据的引用),从 navigation controller 弹出 B 并将 C 推入其中。
  2. 将数据发送给A,从navigation controller中弹出B,然后在A的viewWillAppear方法中,检查数据是否不为nil,以确定是否应将其发送给C并执行 segue.

我应该采用这两种方法中的任何一种吗?或者对于这种情况有更elegant/proper的解决方法吗?

谢谢

组织父控制器的数据管理器或使用核心数据。

如果将数据保存在父控制器中,请像描述的那样使用依赖注入here

以下是您的案例示例:

var dataFromC = "" // or nil
var dataFromB = "" // or nil

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "B",
        let viewController = segue.destinationViewController as? BViewController {
        viewController.dataFromC = self.dataFromC

//           declare method in BViewController
//           var method : ((String) -> ())? = nil
        viewController.method = {[weak self] valueFromB in
            self?.dataFromB = valueFromB
        }
    }

    if segue.identifier == "C",
        let viewController = segue.destinationViewController as? CViewController {
        viewController.dataFromB = self.dataFromB

//           declare method in CViewController
//           var method : ((String) -> ())? = nil
        viewController.method = {[weak self] valueFromC in
            self?.dataFromC = valueFromC
        }
    }
}

如果您想将值从 BViewController 传递给父控制器,请使用 self.method("yourValueFromB") 来更改值。对于 CViewController 的情况,使用相同的方法。

作为一般做法,B 应该在委托协议模式的帮助下将数据发送回其原始视图控制器 A。然后 A 应该能够在委托方法实现中决定从 B 接收什么数据以及将这些数据发送到哪里,在本例中是 C。

这样您的代码看起来更有条理。