如何将对象(不是视图控制器)注册为通知中心观察者
How to register an object (that isn't a view controller) as a Notification Center observer
我知道您可以通过在视图控制器的 viewDidLoad()
方法(使用 self
作为第一个参数)中添加 NotificationCenter.default.addObserver(_:selector:name:object: )
来轻松地将视图控制器注册为通知中心观察者。但是当实例化一个不是视图控制器的对象时,你如何做到这一点呢?我遇到的问题是,当我将 addObserver()
方法放在 init()
中时,self
参数会抛出错误,因为对象尚未初始化。在视图控制器的 viewDidLoad()
方法中,您不会 运行 进入这个问题,因为在调用 viewDidLoad
时,视图控制器已经初始化。
有什么建议吗?提前致谢
您必须先完成属性的初始化,或者如果您正在 class 子 class 调用 super.init
。
下面的例子可以工作:
class AClass {
init() {
NotificationCenter.default.addObserver(self,
selector: #selector(handle),
name: .init("NotificationName"),
object: nil)
}
@objc func handle() {}
}
或继承:
class BaseClass {}
class BClass: BaseClass {
override init() {
super.init()
NotificationCenter.default.addObserver(self,
selector: #selector(handle),
name: .init("NotificationName"),
object: nil)
}
@objc func handle() {}
}
我知道您可以通过在视图控制器的 viewDidLoad()
方法(使用 self
作为第一个参数)中添加 NotificationCenter.default.addObserver(_:selector:name:object: )
来轻松地将视图控制器注册为通知中心观察者。但是当实例化一个不是视图控制器的对象时,你如何做到这一点呢?我遇到的问题是,当我将 addObserver()
方法放在 init()
中时,self
参数会抛出错误,因为对象尚未初始化。在视图控制器的 viewDidLoad()
方法中,您不会 运行 进入这个问题,因为在调用 viewDidLoad
时,视图控制器已经初始化。
有什么建议吗?提前致谢
您必须先完成属性的初始化,或者如果您正在 class 子 class 调用 super.init
。
下面的例子可以工作:
class AClass {
init() {
NotificationCenter.default.addObserver(self,
selector: #selector(handle),
name: .init("NotificationName"),
object: nil)
}
@objc func handle() {}
}
或继承:
class BaseClass {}
class BClass: BaseClass {
override init() {
super.init()
NotificationCenter.default.addObserver(self,
selector: #selector(handle),
name: .init("NotificationName"),
object: nil)
}
@objc func handle() {}
}