Swift 4 如何在ViewControllers 和ContainerViews 之间传递数据?

Swift 4 How to pass data between ViewControllers and ContainerViews?

我有3个ViewController:ViewController A和ViewController B,以及Controller C,它实际上是由两个UIView组成的ContainerView

如上图所示,ViewController C 背景清晰,"Test Label" 可以在 ViewController A 和 B 的 UIView 中看到。

当我从 ViewController A 向上滑动到 ViewController B 时,我希望能够执行一些动画(淡入淡出 in/out、翻译、更改文本等。 ).假设我想将 "Test Label" 的文本更改为 "Some new text",问题是我一进入 ViewController B,就会收到 "Unexpectedly found nil while unwrapping an Optional value" 错误。

为什么我得到的是 nil?如何正确更改标签文本?

这段代码似乎有道理,但我无法正确理解:

let containerViewController = ContainerViewController()
        containerViewController.testLabel.text = "Some new text"

我也试过:

let containerViewController = storyboard?.instantiateViewController(withIdentifier: "containerViewController") as! containerViewController


        containerViewController.testLabel.text = "Some new text"

我是否必须在 ViewController A 的 override func prepare 中添加一些内容?

正确,您必须在您的原始视图控制器中使用 prepare(for segue:..) 覆盖,它将作为 segue.destination 传递给 ViewController B 的实例。

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    if let viewControllerB = segue.destination as? ViewControllerB
    {
        viewControllerB.testLabel.text = "Some new text"
    }
}

查看本教程了解更多信息:https://learnappmaking.com/pass-data-between-view-controllers-swift-how-to/

你可以给从容器到 viewController C 的嵌入 segue 一个标识符让说 embedSegueFromBToC 然后在 prepare for segue 中捕获实际的 ViewController C在父控制器中说 B.

所以在 B viewController 中添加:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "embedSegueFromBToC" {
            if let viewControllerC =  segue.destination as? ViewControllerC {
                viewContrllerC.loadViewIfNeeded() // you might need this since the need to access the testLabel which a UI component that need to be loaded
                viewControllerC.testLabel.text = "Some new text"
            }
        }
    }