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

时间:2019-06-05 04:09:50

标签: ios swift uicontainerview

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

My Storyboard

如上图所示,ViewController C具有清晰的背景,因此可以在ViewController A和B的UIView中看到“测试标签”。

当我从ViewController A向上滑动以转到ViewController B时,我希望能够执行一些动画(淡入/淡出,翻译,更改文本等)。假设我要将文本从“测试标签”更改为“一些新文本”,问题是,一旦我进入ViewController B,就会收到“在包装可选值时意外发现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的覆盖功能准备中添加一些内容?

2 个答案:

答案 0 :(得分:1)

您可以将嵌入的容器从容器中传递给viewController C的标识符,让其说embedSegueFromBToC,然后在父控制器中为segue做准备时捕获实际的ViewController C,例如说{{1} }。

因此,在B viewController中添加以下内容:

B

答案 1 :(得分:0)

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

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/