KVO不适用于Settings.bundle值

时间:2019-03-15 13:59:27

标签: ios swift

我正在尝试观察子窗格中PSSliderSpecifier的值变化,但它仅适用于iOS 9模拟器。

这是我在AppDelegate文件中使用的代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        UserDefaults.standard.addObserver(
        self,
        forKeyPath: UserDefaultsAccess.UserDefaultsKeys.SliderValue,
        options: [.new, .initial, .old],
            context: nil)
        return true
    }

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
    if keyPath == UserDefaultsAccess.UserDefaultsKeys.SliderValue, let change = change, let newSiliderValue = change[NSKeyValueChangeKey.newKey] as? Float {
        foo(sliderValue: newSiliderValue)

    }
}

observeValue从未被调用。

新值始终会保存,但我不会收到任何通知

1 个答案:

答案 0 :(得分:0)

此代码是正确的,可以观察设置包中的值更改。

我可以建议验证UserDefaultsAccess.UserDefaultsKeys.SliderValue与设置捆绑中指定的Identifier相同吗?

这是一个简单的独立示例项目,其中显示了从实际的设置捆绑包https://github.com/ralfebert/UserDefaultsExample中观察用户默认值。在模拟器和设备上,从设置应用切换回应用时,都会收到更改事件。也许孤立地进行尝试可以使您了解可能有什么不同/导致项目中的问题。

可能与您的问题无关:当我使用代码片段重现该问题时,我遇到的唯一问题是调用super.observeValue导致“收到了-observeValueForKeyPath:ofObject:change:context:消息但未处理”崩溃-处理了值更改后,不应调用super。