2014-12-02 6 views
9

Ho un controller di visualizzazione con un pulsante. Quando viene premuto il pulsante aggiunge un osservatore, in questo modo:NSNotificationCenter: rimozione di un osservatore in Swift

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

Quando rigetto del presente controller di vista, e poi tornare ad esso e premere il pulsante //code viene eseguito due volte. Se esco e ritorna, lo //code viene eseguito tre volte e così via.

Quello che voglio fare è rimuovere l'Observer prima di aggiungerlo di nuovo, quindi questo codice non viene eseguito due volte. Ive gone through the documentation here e Ive ha aggiunto questa riga di codice appena sopra dove aggiungo l'Observer:

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

Ma questo non è lavoro.

Qualcuno può dirmi dove sto andando male?

risposta

28

Quando si utilizza l'approccio basato su "blocchi" per osservare le notifiche, lo self non è in realtà l'osservatore. La funzione restituisce un oggetto che agisce come l'osservatore:

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

è necessario mantenere un riferimento a questo oggetto restituito e passarlo come l'osservatore quando si chiama removeObserver

E 'spiegato bene in Apple doc here

+0

risolto i miei problemi - molte grazie! – Jimmery

0

Implementato in questo modo, sembra funzionare correttamente.

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