Вы создаете новый, второй экземпляр дочернего контроллера представления. Но если вы создали «контейнер» в IB, он уже создан для вас.
Существует два способа передачи данных дочернему контроллеру родительского контроллера. Вы можете передать исходные данные в prepare(for:sender:)
:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destination = segue.destination as? SecondViewControllerProtocol {
destination.passData(string: "Initial value")
}
}
Если вы хотите позже обновить его, вы можете получить соответствующую children
:
@IBAction func didTapButton(_ sender: Any) {
for child in children {
if let child = child as? SecondViewControllerProtocol {
child.passData(string: "Updated value")
}
}
}
(Вы, очевидно, можете сохранить ссылку, которую вы захватили во время prepare(for:sender:)
, если хотите).
Затем контроллер второго представления может обновить свою метку соответствующим образом:
protocol SecondViewControllerProtocol {
func passData(string: String)
}
class SecondViewController: UIViewController {
@IBOutlet weak var label: UILabel!
private var string: String?
override func viewDidLoad() {
super.viewDidLoad()
// this is in case you passed the data before the label was hooked up
label.text = string
}
}
extension SecondViewController: SecondViewControllerProtocol {
func passData(string: String) {
self.string = string
guard let label = label else { return }
UIView.transition(with: label, duration: 0.25, options: .transitionCrossDissolve, animations: {
label.text = string
}, completion: nil)
}
}
Что дает: