无法接收来自通知中心的通知

can't receive notifications from Notification Center

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

class 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:

class 第二VC: 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)
}

}

而且我从来没有看到“!!!!!!!!!!!!!!!!”,我做错了什么?

正在发生的事情是,您从第一个视图控制器 post 在 viewDidLoad 中发送通知,然后在 viewDidAppear 你正在推送你的第二个视图控制器,然后订阅通知中心。那时你的通知已经被解雇,因此你没有收到它。您的第二个视图控制器将仅接收被触发的通知 post 它对通知中心的订阅。创建一个计时器,它会在视图出现后几秒钟内触发通知推送你的第二个视图控制器,你会看到它工作

在上面提到的代码中,您首先 post 发送通知,然后为其添加观察者。因此,为了调用 testFunc 方法,您需要先添加 Observer 然后 post 通知。

您可以在 firstVC 中为 posting 通知添加几秒延迟。

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