2014-12-02 4 views
9

Ich habe einen View-Controller mit einer Schaltfläche. Wenn die Taste gedrückt wird, sie fügt einen Beobachter, etwa so:NSNotificationCenter: Entfernen eines Beobachters in Swift

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

Wenn ich diese View-Controller schließen, und dann darauf zurück und drücken Sie die Taste die //code zweimal ausgeführt wird. Wenn ich weggehe und wieder zurückkomme, wird die //code dreimal ausgeführt, und so weiter.

Ich möchte den Observer entfernen, bevor ich ihn erneut hinzufüge, also wird dieser Code nicht zweimal ausgeführt. Ive gone through the documentation here und Ive hinzugefügt, um diese Zeile Code nur oben, wo ich fügen Sie den Observer:

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

Aber dieses ist nicht arbeiten.

Kann mir jemand sagen, wo ich falsch liege?

Antwort

28

Wenn Sie den auf Blöcken basierenden Ansatz zum Beobachten von Benachrichtigungen verwenden, ist self nicht der Beobachter. Die Funktion gibt ein Objekt, das als Beobachter fungiert:

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

Sie müssen einen Verweis auf dieses zurückgegebene Objekt halten und sie als Beobachter geben, wenn Sie removeObserver

nennen Es ist gut erklärt in dem Apple-Doc here

+0

löste meine Probleme - vielen Dank! – Jimmery

0

Implementiert es so, scheint gut zu funktionieren.

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