我有viewController,在viewDidLoad里面我有
NSNotificationCenter.defaultCenter().addObserver(self, selector: "showNextQuestions", name: "showNextQuestionsID", object: nil)
在另一个控制器中我有
NSNotificationCenter.defaultCenter().postNotificationName("showNextQuestionsID", object: nil)
如果我从应用程序回家并再次启动它,则showNextQuestionID会触发两次。
我尝试使用
func applicationDidEnterBackground(application: UIApplication) {
NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil)
}
但这没有帮助,
和viewController
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
我该如何解决这个问题?
答案 0 :(得分:2)
您没有在正确的位置删除通知观察者。您在视图控制器子类中注册观察者,并且需要在同一个类中删除它。一个合理的位置是覆盖viewWillDisappear方法。将以下代码放在视图控制器子类中:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
同时删除
NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil)
来自您的AppDelegate。当你提供自我' AppDelegate中的参数,它指的是AppDelegate类,而不是您的视图控制器。当您在视图控制器sublcass中调用删除通知观察者时,self是您的视图控制器,这就是您想要的。
最后,当您只调用removeObserver(self)而没有其他参数时,它将取消注册该对象的所有观察者。这样你就不必通过名字列出每个观察者。
答案 1 :(得分:0)
将观察者放在AppDelegate或单例中,以便在应用程序状态期间轻松添加和删除观察者。
答案 2 :(得分:0)
applicationDidEnterBackground
和deinit
应该没问题。
问题在于您尝试删除applicationDidEnterBackground
中的观察者的方式。您正试图从AppDelegate中删除观察者,您需要从ViewController中删除观察者。
解决问题:
1)在视图控制器中监听UIApplicationDidEnterBackgroundNotification:
func init() {
super.init()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "myAppDidEnterBackground", name: UIApplicationDidEnterBackgroundNotification, object: nil)
}
2)实施听取UIApplicationDidEnterBackgroundNotification
func myAppDidEnterBackground() {
NSNotificationCenter.defaultCenter().removeObserver(self, name: "showNextQuestionsID", object: nil)
}
3)额外。您还可以收听UIApplicationWillEnterForegroundNotification
,以便再次添加自定义通知