【问题标题】:Swift specific notification observer initializationSwift 特定的通知观察者初始化
【发布时间】:2017-08-23 08:42:29
【问题描述】:

在尝试使用新的 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'

【问题讨论】:

    标签: swift xcode swift3


    【解决方案1】:

    HomeViewController 是你的视图控制器

      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
        }
    

    【讨论】:

    • 将方法设为静态可避免错误,但随后我无法访问实例属性...
    【解决方案2】:

    由于您的keyboardWillShowObserver 不是惰性的,它的闭包将在MyAwesomeViewController 的实例初始化期间执行。据我了解,这意味着self 将被解释为MyAwesomeViewController 类,而不是类的实例。

    有一个简单的方法可以修复这个错误:make private lazy var keyboardWillShowObserver 这样闭包就会在实例上执行它会被完全初始化。

    【讨论】:

    • 让它变得懒惰会违反观察者模式,对吗?因为如果不显式访问keyboardWillShowObserver,则永远不会分配通知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多