2014-12-02 103 views
9

我有一个按钮的视图控制器。当按下按钮,它增加了一个观察者,像这样:NSNotificationCenter:在Swift中删除观察者

func buttonPress(sender:UIButton){ 
    NSNotificationCenter.defaultCenter().addObserverForName("buttonPressEvent", object:nil, queue:nil, usingBlock:{(notif) -> Void in 
     // code 
    }) 
} 

当我关闭此视图控制器,然后返回到它并按//code执行两次的按钮。如果我离开并再次返回,//code会执行三次,以此类推。

我想要做的是在再次添加Observer之前删除Observer,因此此代码不会执行两次。 Ive gone through the documentation here并且Ive加入这一行代码刚好高于我添加观察报:

NSNotificationCenter.defaultCenter().removeObserver(self, name:"buttonPressEvent", object:nil) 

但是,这心不是工作。

任何人都可以告诉我哪里出错了吗?

回答

28

当您使用'基于块'的方法观察通知时,self实际上并不是观察者。该函数返回充当观察者的对象:

func addObserverForName(_ name: String?, 
       object obj: AnyObject?, 
        queue queue: NSOperationQueue?, 
      usingBlock block: (NSNotification!) -> Void) -> NSObjectProtocol 

你需要一个参考保持这个返回的对象,并把它作为当你调用removeObserver

它在苹果文档解释以及观察员here

+0

解决了我的问题 - 非常感谢! – Jimmery 2014-12-03 09:54:37

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)  
    }