【问题标题】:NSNotificationCenter: Removing an Observer in SwiftNSNotificationCenter:在 Swift 中移除一个观察者
【发布时间】:2016-10-13 00:08:02
【问题描述】:

我有一个带有按钮的视图控制器。当按下按钮时,它会添加一个观察者,如下所示:

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

当我关闭这个视图控制器,然后返回它并按下按钮时,//code 会执行两次。如果我离开并再次回来,//code 会被执行 3 次,以此类推。

我想要做的是在再次添加之前删除观察者,所以这段代码不会执行两次。 Ive gone through the documentation here 并且我在添加观察者的上方添加了这行代码:

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

但这不起作用。

谁能告诉我哪里出错了?

【问题讨论】:

    标签: swift nsnotificationcenter


    【解决方案1】:

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

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

    调用removeObserver时需要保留对这个返回对象的引用,并作为观察者传入

    Apple Doc here 中有很好的解释

    【讨论】:

      【解决方案2】:

      像这样实现它,似乎工作正常。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-29
        • 2014-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多