我有一个带按钮的视图控制器。当按下按钮时,它会添加一个观察者,如下所示:
func buttonPress(sender:UIButton){
NSNotificationCenter.defaultCenter().addObserverForName("buttonPressEvent", object:nil, queue:nil, usingBlock:{(notif) -> Void in
// code
})
}
当我关闭此视图控制器,然后返回到它并按下按钮时,//code
执行两次。如果我离开并再次回来,//code
执行三次,依此类推。
我想要做的是在我再次添加之前删除Observer,因此此代码不会执行两次。 Ive gone through the documentation here并且我在上面添加了Observer:
的地方添加了这行代码 NSNotificationCenter.defaultCenter().removeObserver(self, name:"buttonPressEvent", object:nil)
但这不起作用。
谁能告诉我哪里出错?
答案 0 :(得分:29)
当您使用基于“块”的方法来观察通知时,self
实际上并不是观察者。该函数返回一个充当观察者的对象:
func addObserverForName(_ name: String?,
object obj: AnyObject?,
queue queue: NSOperationQueue?,
usingBlock block: (NSNotification!) -> Void) -> NSObjectProtocol
您需要保留对此返回对象的引用,并在调用removeObserver
时将其作为观察者传递
Apple Doc here
中对此进行了详细解释答案 1 :(得分:0)
像这样实现它,似乎工作正常。
override func viewDidLoad()
{
super.viewDidLoad()
AddScreenShotNotification()
}
func AddScreenShotNotification() {
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: #selector(MyViewController.ScreenShotTaken),
name: UIApplicationUserDidTakeScreenshotNotification,
object: nil)
}
func ScreenShotTaken()
{
// do something
}
override func viewWillDisappear(animated: Bool) {
NSNotificationCenter.defaultCenter().removeObserver(self)
}