首页 > 解决方案 > Selector 方法必须与观察者所在的实例相同吗?

问题描述

通常,addObserver两者的代码都Selector method tag with @Objc编码在同一个实例(实例化类)中。

可以将Selector不同实例的 a 传递给addObserver?

这样做的原因是因为Selector大多数时候行为作为回调。一些回调方法是常用的,可以很好地编码到一个CommonCallBack类中,使用示例如下:

class SomeViewController{

  override func viewDidLoad() {
    ...

    let common = CommonCallback()

    NotificationCenter.default.addObserver(
      self, 
      selector: #selector(common.methodA), 
      name: "notificationName", 
      object: nil
    )

  }

}

class CommonCallback{

  @Objc func methodA() { 
    // doing A 
  }

}

问题是我不断得到unrecognized selector sent to instance

标签: iosswiftcallbackselector

解决方案


您也可以通过这种方式实现此目的

class SomeViewController {

    override func viewDidLoad() {
        let common = CommonCallback()
        common.enableObserver = true
    }

}

class CommonCallback{
    var enableObserver : Bool!
    override func viewDidLoad() {
        if enableObserver {
            NotificationCenter.default.addObserver(
                self,
                selector: #selector(common.methodA),
                name: "notificationName",
                object: nil
            )
        }
    }
    @objc func methodA() {
        // Your code here
    }
}

推荐阅读