如何在布局类似于叉子的 UIViewController 之间导航和传递数据?
How to navigate and pass data between UIViewControllers whose layout resembles a fork?
我有几个 UIViewControllers
如图所示
我想要的是将数据 从 B 传递到 C 并进行转换。到目前为止,我已经提出了 2 种可能的解决方案:
- 创建 C
UIViewController
class 的新实例(并在其中保存数据的引用),从 navigation controller
弹出 B 并将 C 推入其中。
- 将数据发送给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。
这样您的代码看起来更有条理。
我有几个 UIViewControllers
如图所示
我想要的是将数据 从 B 传递到 C 并进行转换。到目前为止,我已经提出了 2 种可能的解决方案:
- 创建 C
UIViewController
class 的新实例(并在其中保存数据的引用),从navigation controller
弹出 B 并将 C 推入其中。 - 将数据发送给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。
这样您的代码看起来更有条理。