有以下例子:
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)
在检查
ViewController
时LLDB
中回调内断点上的对象,我得到以下信息:(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/