在准备 segue 时,如何将数据传递给子 UIViewController?

Posted

技术标签:

【中文标题】在准备 segue 时,如何将数据传递给子 UIViewController?【英文标题】:In preparing for segue, how to pass data to a child UIViewController? 【发布时间】:2017-09-28 19:54:59 【问题描述】:

ios 中的典型转场中,视图控制器 A 转场到 B,我在 A 中覆盖 prepare(for:sender:),以将一些数据传递给 B

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let b = segue.destination as! ViewControllerB
    b.someData = ...

但是如果B 有一个嵌入的子视图控制器,此时它还不会被加载。是否有推荐的方法将数据传递给嵌入式子视图控制器?

我可以在ViewControllerB 上定义字段,然后让它在viewDidLoad 方法中将它们传递给孩子。 (此时,子视图控制器 出现在 B 的 childViewControllers 数组中。)但是,这对我来说似乎有点难看。

【问题讨论】:

孙子和祖父母与代表之间的直接沟通怎么样? 好吧,如果你有 A->B->C,并且你需要从 A->C 传递数据,你可以将它设置为 B,在 B 内部做同样的设置为 C . 【参考方案1】:

遵循 OOP 原则,尤其是“抽象”。 ViewControllerA 不应该知道 ViewControllerB 如何完成这项工作。如果 ViewControllerB 自己加载任何控件,那么它就是 ViewControllerB 的事情。 ViewControllerA 的工作是为 ViewControllerB 提供完成工作所需的一切。 所以是的,我会使用 viewDidLoad 事件来加载 childViewController。

【讨论】:

【参考方案2】:

你可以在视图控制器 B 中有一个方法,例如

public configureChildVC(data: Any) 
// in here set data to child vc

然后准备转场

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let b = segue.destination as! ViewControllerB
    b.configureChildVC(data: whatever)

【讨论】:

以上是关于在准备 segue 时,如何将数据传递给子 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:将数据传递给 segue

在函数内将数据传递给 segue.destination 的问题

将数据传递给父场景的委托与展开 Segue

使用 Storyboard Segue iOS 将数据传递给视图控制器

Android:如何将数据传递给子活动?

Swift segue 不会将数据传递给旧的 ViewController