J'ai une application simple: premier VC:

Classe ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.post(name: NSNotification.Name("test"), object: nil, userInfo: nil)
}


override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "secondVC")
    self.present(vc, animated: true, completion: nil)
}

}

Deuxième VC:

Classe SecondVC: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(SecondVC.testFunc(notification:)), name: NSNotification.Name("test"), object: nil)
}

@objc func testFunc(notification: NSNotification) {        
    print("!!!!!!!!!!!!!!!!")
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

}

Et je n'ai jamais vu le "!!!!!!!!!!!!!!!!", qu'est-ce que je fais de mal?

0
Nikita Fainberg 5 nov. 2020 à 12:39

2 réponses

Meilleure réponse

Ce qui se passe, c'est que vous publiez la notification dans un viewDidLoad à partir du premier contrôleur de vue, puis plus tard sur viewDidAppear vous poussez votre deuxième contrôleur de vue, puis vous vous abonnez à le centre de notification. À ce stade, votre notification a déjà été déclenchée, vous ne la recevez donc pas. Votre deuxième contrôleur de vue ne recevra que les notifications qui sont déclenchées après son abonnement au centre de notification. Créez un minuteur qui déclenchera la notification quelques secondes après l'apparition de la vue, pousse votre deuxième contrôleur de vue et vous le verrez fonctionner

1
Pancho 5 nov. 2020 à 09:52

Dans votre code mentionné ci-dessus, vous publiez d'abord la notification & amp; puis en ajoutant l'observateur pour cela. Ainsi, afin d'appeler la méthode , vous devez d'abord ajouterObserver, puis publier la notification.

Vous pouvez ajouter un délai de quelques secondes dans firstVC pour la publication de la notification.

override func viewDidLoad() {
      super.viewDidLoad()
      DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) {
           NotificationCenter.default.post(name: NSNotification.Name("test"), object: nil, userInfo: nil)
      }
}
0
Anish 5 nov. 2020 à 12:27