假设我有一个 key @"MyPreference"
,对应的值通过NSUserDefaults
.
有没有办法在值被修改时得到通知?
还是可以通过绑定来完成?(但在这种情况下,我希望我的对象被通知更改,而不是将值绑定到 UI 元素,以便我可以执行其他任务。)
我知道NSUserDefaultsDidChangeNotification
可以观察到,但这似乎是一种全有或全无的方法,并且似乎没有一种机制可以获取已修改的特定键值对。(随时纠正。)
假设我有一个 key @"MyPreference"
,对应的值通过NSUserDefaults
.
有没有办法在值被修改时得到通知?
还是可以通过绑定来完成?(但在这种情况下,我希望我的对象被通知更改,而不是将值绑定到 UI 元素,以便我可以执行其他任务。)
我知道NSUserDefaultsDidChangeNotification
可以观察到,但这似乎是一种全有或全无的方法,并且似乎没有一种机制可以获取已修改的特定键值对。(随时纠正。)
花了一整天的时间寻找答案,问问题10分钟后才找到答案……
通过 Key-Value-Observing 遇到了一个解决方案:
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
forKeyPath:@"values.MyPreference"
options:NSKeyValueObservingOptionNew
context:NULL];
或者,更简单地说(根据下面的评论):
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:@"MyPreference"
options:NSKeyValueObservingOptionNew
context:NULL];
迅速:
override func viewDidLoad() {
super.viewDidLoad()
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil)
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
// your logic
}
deinit {
NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY")
}
苹果员工建议在这里使用 NSUserDefaultsDidChangeNotification 通知:https ://devforums.apple.com/message/237718#237718
我同意@DenNukem。我正在使用NSKeyValueObservingOptionNew
. 但是这个函数开始给我BAD_ACCESS Code=1
错误,无论我使用什么NSUserDefault
来保存其他对象。如果您使用的是 Key-Value Observer (KVC),请注意NSUserDefaults
.
这是解决方案的链接: NSUserDefaults and KVO issues