通常,代码addObserver
和Selector 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
您也可以通过这种方式实现这一目标
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
}
}
我发现,如果代码出错了。 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