我正在尝试观察子窗格中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
从未被调用。
新值始终会保存,但我不会收到任何通知
答案 0 :(得分:0)
此代码是正确的,可以观察设置包中的值更改。
我可以建议验证UserDefaultsAccess.UserDefaultsKeys.SliderValue
与设置捆绑中指定的Identifier
相同吗?
这是一个简单的独立示例项目,其中显示了从实际的设置捆绑包https://github.com/ralfebert/UserDefaultsExample中观察用户默认值。在模拟器和设备上,从设置应用切换回应用时,都会收到更改事件。也许孤立地进行尝试可以使您了解可能有什么不同/导致项目中的问题。
可能与您的问题无关:当我使用代码片段重现该问题时,我遇到的唯一问题是调用super.observeValue
导致“收到了-observeValueForKeyPath:ofObject:change:context:消息但未处理”崩溃-处理了值更改后,不应调用super。