Must Selector方法与观察者的位置相同?

问题描述 投票:0回答:2

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

有可能将Selector从不同的实例传递到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

ios swift callback selector
2个回答
1
投票

您也可以通过这种方式实现这一目标

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

0
投票

我发现,如果代码出错了。 observer参数必须与Selector method属于同一类,因此不是:

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

它应该是:

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

这将调用CommonCallback.methodA而不是SomeViewController.methodA

© www.soinside.com 2019 - 2024. All rights reserved.