Проблема в том, что вы представляете один экземпляр ChildView
и назначаете делегата для другого экземпляра ChildView
. Таким образом, дочернее представление, представленное на экране, НЕ является тем же, которое вызывает делегат. Установите делегата при добавлении ChildView
:
let to = ChildView()
self.addChild(to)
self.mainView.addSubview(to.view)
self.mainViewConstraint.constant = to.view.frame.height
// set the delegate here
to.userDelegate = self.mainView
to.view.frame = self.mainView.bounds
to.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
Кроме того, чтобы предотвратить сохранение циклов, используйте weak
ссылку на делегата:
protocol UserDelegate: AnyObject {
func changeName(name: String)
}
class ChildView: UIViewController {
weak var userDelegate: UserDelegate?
@IBAction func changeNameBtn(_ sender: UIButton) {
self.userDelegate?.changeName(name: "TestChanges")
}
}
Наконец, вы можете удалить реализацию viewDidLoad
из основного представления:
class MainView: UIViewController, UserDelegate {
// this should be enough
func changeName(name: String) {
self.helloLabel.text = "Hello \(name)!"
}
}