如何在布局类似于fork的UIViewControllers之间导航和传递数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在布局类似于fork的UIViewControllers之间导航和传递数据?相关的知识,希望对你有一定的参考价值。

我有几个像所示的UIViewControllers

Fork Layout

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

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

我应该采取这两种方法中的任何一种吗?或者是否有更优雅/适当的解决方案?

谢谢

答案

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

如果将数据保存在父控制器中,请使用依赖注入,如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.

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

以上是关于如何在布局类似于fork的UIViewControllers之间导航和传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Tailwind CSS 创建类似于 Quora 的居中 3 列布局

如何创建类似于 instagram 布局应用程序的手势驱动的动态可调整大小视图

如何在不更改标准输入缓冲的情况下 fork-then-execve?

java并发编程(10)Fork/Join

SwiftUI 的正确布局方式(类似于 Autolayout)

UITapGestureRecognizer 不适用于 UIView 动画