Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios can';无法从通知中心接收通知_Ios_Swift_Nsnotificationcenter - Fatal编程技术网

Ios can';无法从通知中心接收通知

Ios can';无法从通知中心接收通知,ios,swift,nsnotificationcenter,Ios,Swift,Nsnotificationcenter,我有一个简单的应用程序: 第一个VC: 类ViewController:UIViewController{ override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.post(name: NSNotification.Name("test"), object: nil, userInfo: nil) } override func viewDidAppear(_

我有一个简单的应用程序: 第一个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)
}
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)
}
}

第二个VC:

类SecondVC: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)
}
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)
}
}


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

发生的事情是,您从第一个视图控制器在视图加载中发布通知,然后在视图显示后,推第二个视图控制器,然后订阅通知中心。此时您的通知已经被触发,因此您没有收到它。您的第二个视图控制器将只接收在其订阅通知中心后触发的通知。创建一个计时器,在第二个视图控制器出现后几秒钟内触发通知,您将看到它正在工作。在上述代码中,您首先发布通知,然后为其添加观察者。因此,为了调用testFunc方法,您需要先添加Observer,然后发布通知

override func viewDidLoad() {
      super.viewDidLoad()
      DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) {
           NotificationCenter.default.post(name: NSNotification.Name("test"), object: nil, userInfo: nil)
      }
}
您可以在firstVC中添加几秒钟的延迟来发布通知

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

你能举个例子吗?我不知道您的第二个视图控制器将只接收订阅通知中心后发布的通知。在代码示例中,您首先发布通知,然后显示第二个视图控制器,并订阅以接收来自通知中心的通知。您没有收到任何通知的原因现在应该清楚了,因为在您的第二个视图控制器订阅接收通知后,将不会发布更多通知。您需要做的是确保在订阅通知中心后发布通知。