2014-12-02 102 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)  
    }