如何在布局类似于分叉的 UIViewController 之间导航和传递数据?
Posted
技术标签:
【中文标题】如何在布局类似于分叉的 UIViewController 之间导航和传递数据?【英文标题】:How to navigate and pass data between UIViewControllers whose layout resembles a fork? 【发布时间】:2019-04-24 15:20:45 【问题描述】:我有几个UIViewControllers
,如图所示
我想要的是将数据 从 B 传递到 C 并进行转换。到目前为止,我提出了两种可能的解决方案:
-
创建 C
UIViewController
类的新实例(并在其中保存数据的引用),从 navigation controller
中弹出 B 并将 C 推入其中。
将数据发送给A,从navigation controller
弹出B,然后在A的viewWillAppear
方法中,检查数据是否为nil,判断是否应该发送给C,然后执行segue
.
我应该采用这两种方法中的任何一种吗?或者对于这种情况有更优雅/更合适的解决方案吗?
谢谢
【问题讨论】:
它自己的视图控制器 我不明白。 A推给B?你想从 B 过渡到 C? 场景是我从A到B,现在想从B到C还要传递一些数据 您已经接受了一个答案,但接下来,请尝试更准确地使用您的语言。从 A 到 B 然后从 B 到 C 没有任何意义。你是在推动还是展示? A 是 B 和 C 的父母,而您正在孩子之间过渡吗? A 是它自己的视图控制器,用户可以推送到 B 或 C 吗?现在没关系,但是学好术语,会有很大帮助的。 【参考方案1】:组织父控制器的数据管理器或使用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
的情况,使用相同的方法。
【讨论】:
所以它会像我发布的第二种方法吗? 是的。有很多方法可以做到这一点。上面的示例使用依赖注入,这里从父控制器method
传递函数(closure
)。您也可以将其包装到协议或处理程序对象中。所有组合都有效。【参考方案2】:
作为一般做法,B 应在委托协议模式的帮助下将数据发送回其原始视图控制器 A。然后 A 应该能够在委托方法实现中决定从 B 接收什么数据以及将这些数据发送到哪里,在本例中是 C。
这样你的代码看起来更有条理。
【讨论】:
以上是关于如何在布局类似于分叉的 UIViewController 之间导航和传递数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何从情节提要中获取 UIViewControl 对象的笔尖名称
如何使用 Tailwind CSS 创建类似于 Quora 的居中 3 列布局
如何在布局类似于fork的UIViewControllers之间导航和传递数据?
Flutter Ios 上不允许使用资源分叉、Finder 信息或类似的碎屑