Как пользоваться наблюдателем? Почему мой наблюдатель не работает здесь? - PullRequest
0 голосов
/ 06 марта 2020

В моем проекте есть два контроллера вида и два класса контроллера вида. Я хочу изменить цвет фона первого контроллера представления от второго контроллера представления, используя уведомление и наблюдателя. Но это не работает. Я заметил, что метод changeViewControllerColor (_ :) не вызывается.

Контроллер первого просмотра:

import UIKit

let colorChangeNotificationKey = "changeFirstVcColor"

class FirstViewController: UIViewController {

    let notiName = Notification.Name(rawValue: colorChangeNotificationKey)

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        observer()
    }


    func observer() {

        NotificationCenter.default.addObserver(self, selector: #selector(FirstViewController.changeViewControllerColor(_:)), name: self.notiName, object: self)
    }

    @objc func changeViewControllerColor(_: NSNotification) {
        self.view.backgroundColor = UIColor.white
    }


    @IBAction func button(_ sender: UIButton) {

        let vc = storyboard?.instantiateViewController(identifier: "secondViewController") as! SecondViewController
        navigationController?.pushViewController(vc, animated: true)
    }
}

Контроллер второго просмотра:

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()

        label.text = "First VC colour is white now"

        let notiName = Notification.Name(rawValue: colorChangeNotificationKey)
        NotificationCenter.default.post(name: notiName, object: nil)
    }
}

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Когда вы добавляете своего наблюдателя, вы передаете ему объект self.

Возможно, вы хотите передать ему ноль.

Из документации:

anObject

, то есть только уведомления, отправленные этим отправителем, доставляются наблюдателю.

Если вы передаете ноль, центр уведомлений не использует отправителя уведомления, чтобы решить, следует ли доставлять это для наблюдателя. Объект, чьи уведомления хочет получить наблюдатель;

Таким образом, единственное, от чего он будет принимать уведомления, - это сам по себе, что маловероятно, что вы хотите.

Кроме того, я согласен с Хари sh, вы должны просто использовать делегата.

0 голосов
/ 06 марта 2020

В SecondViewController:

NotificationCenter.default.post(name: Notification.Name("changeFirstVcColor"), object: nil)

В FirstViewController:

NotificationCenter.default.addObserver(self, selector: #selector(self.methodOfReceivedNotification(notification:)), name: Notification.Name("changeFirstVcColor"), object: nil)

@objc func methodOfReceivedNotification(notification: Notification) {}
...