swift - KVO Swift : newValue is always nil

标签 swift key-value-observing objective-c-runtime

有以下例子:

import UIKit

@objc class ViewController: UIViewController {

    @objc dynamic var buggyApple: NSObject?

    var obs: NSKeyValueObservation?

    override func viewDidLoad() {
        super.viewDidLoad()
        obs = observe(\.buggyApple, changeHandler: { (obj, change) in
            print(change)
        })
        buggyApple = NSObject()
        buggyApple = NSObject()
    }
}

我在调试控制台中得到相应的输出:
NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)
NSKeyValueObservedChange<Optional<NSObject>>(kind: __C.NSKeyValueChange, newValue: Optional(nil), oldValue: Optional(nil), indexes: nil, isPrior: false)

在检查 ViewControllerLLDB 中回调内断点上的对象,我得到以下信息:
(lldb) po obj.buggyApple
▿ Optional<NSObject>
  - some : <NSObject: 0x600000908fa0>

所以,事实上,新NSObject已成功发送,然而,change仍然是引用nil .我的代码是否有问题以及如何解决?

最佳答案

您需要提供new options 的选项observer 的输入参数在 change 中接收新值的方法.

obs = observe(\.buggyApple, options: [.new], changeHandler: { (obj, change) in
    print(change)
})

关于swift - KVO Swift : newValue is always nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56427889/

相关文章:

SwiftChart 添加范围突出显示

ios - 如何在不滚动的情况下选择 TableView 中的单元格?

objective-c - NSMutableDictionary 和新项目插入 KVO

objective-c - 将所有消息转发给其他对象

ios - 如何从不同的目标访问数组(KeyboardViewController)

ios - swift : Clear UIView

javascript - Angular 2+ 检测服务内部的对象属性更改

objective-c - 3 个通知而不是 1 个

ios - 从包含对象名称的字符串访问对象的属性

ios - NS_AVAILABLE(10_10, 8_0) 在为 iOS 7 构建时导致崩溃