53

假设我有一个 key @"MyPreference",对应的值通过NSUserDefaults.

有没有办法在值被修改时得到通知?

还是可以通过绑定来完成?(但在这种情况下,我希望我的对象被通知更改,而不是将值绑定到 UI 元素,以便我可以执行其他任务。)

我知道NSUserDefaultsDidChangeNotification可以观察到,但这似乎是一种全有或全无的方法,并且似乎没有一种机制可以获取已修改的特定键值对。(随时纠正。)

4

4 回答 4

81

花了一整天的时间寻找答案,问问题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];
于 2009-07-17T04:11:13.123 回答
23

迅速:

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")
}
于 2015-06-28T10:11:45.763 回答
11

苹果员工建议在这里使用 NSUserDefaultsDidChangeNotification 通知:https ://devforums.apple.com/message/237718#237718

于 2010-08-23T16:53:52.080 回答
0

我同意@DenNukem。我正在使用NSKeyValueObservingOptionNew. 但是这个函数开始给我BAD_ACCESS Code=1错误,无论我使用什么NSUserDefault来保存其他对象。如果您使用的是 Key-Value Observer (KVC),请注意NSUserDefaults.

这是解决方案的链接: NSUserDefaults and KVO issues

于 2017-01-26T19:41:57.143 回答