【问题标题】:KVO listener issues in Swift 4Swift 4 中的 KVO 侦听器问题
【发布时间】:2018-05-05 07:38:58
【问题描述】:

我正在使用ViewModel 类,如果loginResponse 变量有任何变化,我想设置观察者。

@objcMembers class ViewModel: NSObject {

    var count = 300
    @objc dynamic var loginResponse :String

    override init() {
        loginResponse = "1"
        super.init()
        setupTimer()
    }

    func setupTimer(){
        _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(callTimer), userInfo: nil, repeats: true)
    }

    func callTimer(){
        let minutes = String(count / 60)
        let seconds = String(count % 60)
        loginResponse = minutes + ":" + seconds
        count =  count - 1
    }
}

查看控制器代码:

override func viewDidLoad() {
    super.viewDidLoad()

    _ = viewModel.observe(\ViewModel.loginResponse) { (model, changes) in
        print(changes)
    }
}

我想在我的 Viewcontroller 中收听对 loginResponse 变量的任何更改,但它没有收到回调。我在这里做错了什么?

【问题讨论】:

  • 您需要对观察者的强引用。 _ = 毫无意义。

标签: swift swift4 key-value-observing nsobject


【解决方案1】:

.observe(_:options:changeHandler:) 函数返回一个NSKeyValueObservation 对象,用于控制观察的生命周期。当它被定义或失效时,观察将停止。

由于您的视图控制器没有保留对返回的“观察”的引用,它在viewDidLoad 末尾超出范围,因此停止观察。

要在视图控制器的生命周期内继续观察,请将返回的观察结果存储在属性中。如果您在此之前“完成”观察,您可以在观察上调用invalidate 或将属性设置为nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2021-11-27
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多