【问题标题】:was sent to an object that is not KVC-compliant for the "com" property被发送到“com”属性不符合 KVC 的对象
【发布时间】:2017-07-26 23:02:06
【问题描述】:

我想观察存储在 UserDefaults.standard 中的值在 key 下:com.apple.configuration.managed,所以我这样做了:

UserDefaults.standard.addObserver(self, forKeyPath: "com.apple.configuration.managed", options: [.new, .old], context: nil)

然后我实现了这个:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

}

当我运行应用程序时,observeValue... 在默认值更改时永远不会被调用,而是 Xcode 崩溃并出现此错误:

*** 由于未捕获的异常而终止应用程序 'NSUnknownKeyException',原因:'[ 添加观察者: forKeyPath:@"com.apple.configuration.managed" 选项:1 上下文:0x0] 被发送到“com”不符合 KVC 的对象 属性。'

在 UserDefaults.standard 中观察 com.apple.configuration.managed 的正确方法是什么?

【问题讨论】:

  • 这不是 Detect changes on NSUserDefaults 的副本。这里的问题是关键路径中的点,该问题没有解决。
  • 我猜这个stackoverflow.com/a/14172860/728246 可能会让我的问题看起来像重复,我只是没有意识到“。”是导致此错误的原因...
  • 问题的根本原因是一样的,但是NSUserDefaults 是 KVO 兼容的,而 NSDictionary 不是,所以我认为没有必要关闭作为重复项。

标签: ios swift cocoa


【解决方案1】:

您可以使用 KVC 观察来观察对象的属性,并且可以使用 KVC 观察来观察分配给 UserDefaults 的值,但不能使用 KVC 来观察值标识符包含句点的值,因为this 用于描述分层键路径。

因此,异常消息是正确的,UserDefaults 不符合 com 属性的 KVC;您所要求的是当configuration 所引用对象的apple 属性所引用对象的apple 属性所引用的对象的com 属性所引用的对象的com 属性时得到通知987654328@对象被修改。

因此,您可以使用 KVC 在“MyDefault”更改时收到通知,但在“My.Default”更改时不会收到通知。如果您无法更改用户默认名称,则需要注意NSUserDefaultsDidChangeNotification Notification

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多