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

时间:2019-04-24 15:20:45

标签: ios swift uiviewcontroller uinavigationcontroller uikit

我有几个UIViewControllers,如图所示

Fork Layout

我想要的是将数据从B传递到C ,并进行过渡。到目前为止,我提供了两种可能的解决方案:

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

我应该采用这两种方法中的任何一种吗?还是针对这种情况有更优雅/合适的解决方案?

谢谢

2 个答案:

答案 0 :(得分:2)

组织父控制器的数据管理器或使用Core Data。

如果将数据保留在父控制器中,请使用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,请使用相同的方法。

答案 1 :(得分:1)

通常,B应该在委托协议模式的帮助下将数据发送回其原始视图控制器A。然后,A应该能够确定委托方法的实现,从B接收什么数据以及将数据发送到哪里(在这种情况下为C)。

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