问题描述
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)
}
}