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"
}
}
}
我有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"
}
}
}