2014-12-02 2 views
9

버튼이있는보기 컨트롤러가 있습니다. 버튼을 누를 때 그렇게 같이 관찰자를 추가 NSNotificationCenter : 스위프트에서 옵저버 제거

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

는 I이 뷰 컨트롤러를 해제 한 다음에 돌아가서 //code 회 실행 버튼을 누르면. 나가서 다시 돌아 오면 //code이 세 번 실행됩니다.

Observer를 다시 추가하기 전에 Observer를 제거하면이 코드가 두 번 실행되지 않습니다.

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

그러나이 밤은 가공 : Ive gone through the documentation here와 필자는 그냥 관찰자를 추가 할 경우 위의 코드 줄을 추가했습니다.

어디서 잘못 알 수 있습니까?

답변

28

알림을 관찰하는 데 '블록'기반 접근 방식을 사용하면 self은 실제로 관찰자가 아닙니다.

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

당신이 반환 된 객체에 대한 참조를 유지하고 그것은 애플의 문서에서 잘 설명 된 것 removeObserver

전화를 관찰자로의 전달해야이 기능은 관찰자 역할을하는 객체를 반환 here

+0

내 문제가 해결되었습니다 - 많은 감사합니다! – Jimmery

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)  
    } 
관련 문제