Изменение делегата с дочернего на основной вид - PullRequest
0 голосов
/ 02 мая 2019

У меня есть UIViewController с mainView и ChildView. Я хочу изменить метку в mainView из ChildView

enter image description here

Ребенок, которого я добавляю

let to = ChildView()
self.addChild(to)
self.mainView.addSubview(to.view)
self.mainViewConstraint.constant = to.view.frame.height
to.view.frame = self.mainView.bounds
to.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

mainView - его вид, где отображается childView

Я пытаюсь сделать это с делегатом В ChildView:

protocol UserDelegate {
    func changeName(name: String)
}

class ChildView: UIViewController {

     var userDelegate: UserDelegate?

    @IBAction func changeNameBtn(_ sender: UIButton) {
        self.userDelegate?.changeName(name: "TestChanges")
    }
}

В MainView:

class MainView: UIViewController, UserDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        let ChildView = ChildView()
        ChildView.userDelegate = self
    }

    func changeName(name: String) {
        self.helloLabel.text = "Hello \(name)!"
    }
}

1 Ответ

1 голос
/ 02 мая 2019

Проблема в том, что вы представляете один экземпляр 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)!"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...