在尝试使用新的Swift NotificationCenter时,我试图将观察者对象创建为属性(与将观察者分配给自己的经典Obj-C模式相反):
private let keyboardWillShowObserver = {
return NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil, using: self.keyboardWillShow(_:))
}()
private func keyboardWillShow(_ notification: Notification) {
bottomVerticalSpaceConstraint.constant = 400
}
问题是我收到以下错误消息,即使我有同一个类的成员函数部分:
类型的值'(NSObject) - > () - > MyAwesomeViewController'没有成员'keyboardWillShow'
答案 0 :(得分:1)
HomeViewController是你的viewController
private let keyboardWillShowObserver = {
return NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil, using: { (Notification) in
HomeViewController.keyboardWillShow (Notification)
})
}()
static func keyboardWillShow(_ notification: Notification) {
// bottomVerticalSpaceConstraint.constant = 400
}
答案 1 :(得分:1)
由于keyboardWillShowObserver
不是懒惰的,因此在MyAwesomeViewController
的实例初始化期间将执行它的闭包。据我了解,这意味着self
将被解释为MyAwesomeViewController
类,而不是类的实例。
有一种简单的方法可以解决这个错误:make private lazy var keyboardWillShowObserver
所以闭包将在之后的实例上执行,它将被完全初始化。