我有几个UIViewControllers
,如图所示
我想要的是将数据从B传递到C ,并进行过渡。到目前为止,我提供了两种可能的解决方案:
UIViewController
类的新实例(并在其中保存数据引用),从navigation controller
弹出B,然后将C推入其中。navigation controller
弹出B,然后在A的viewWillAppear
方法中,检查数据是否不为零,以了解是否应将其发送给C并执行segue
。我应该采用这两种方法中的任何一种吗?还是针对这种情况有更优雅/合适的解决方案?
谢谢
答案 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)。
这样,您的代码看起来更有条理。