无法从通知中心接收通知

问题描述

我有一个简单的应用程序: 第一个VC:

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)
}

}

第二个VC:

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)
}

}

我从没见过“ !!!!!!!!!!!”,我在做什么错了?

解决方法

正在发生的事情是,您正在第一个视图控制器的 viewDidLoad 中发布通知,然后稍后在 viewDidAppear 上推送第二个视图控制器,然后订阅通知中心。那时您的通知已经被触发,因此您没有收到它。您的第二个视图控制器将只收到在订阅通知中心后触发的通知。创建一个计时器,该计时器将在视图出现后的几秒钟内触发通知,从而推动您的第二个视图控制器,您将看到它工作

,

在上述代码中,您要先发布通知,然后为其添加观察者。因此,要调用 testFunc 方法,您需要先添加Observer,然后发布通知。

您可以在firstVC中添加几秒钟的延迟来发布通知。

override func viewDidLoad() {
      super.viewDidLoad()
      DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) {
           NotificationCenter.default.post(name: NSNotification.Name("test"),object: nil,userInfo: nil)
      }
}