26

我正在使用最新的 SDK 开发一个 iOS 应用程序。

我想知道一个属性何时NSUserDefaults改变它的值。

我找到了这个,但它特定于 macOS:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
    forKeyPath:[@"values." stringByAppendingString: @"MyPreference"]
    options:NSKeyValueObservingOptionNew
    context:NULL];

我怎样才能在 iOS 上做到这一点?

4

5 回答 5

38

试试NSUserDefaultsDidChangeNotification这个代码片段:

- (id)init {

  self = [super init];

  if(self) {
     [[NSNotificationCenter defaultCenter] addObserver:self
                                              selector:@selector(defaultsChanged:)
                                                  name:NSUserDefaultsDidChangeNotification
                                                object:nil];
  }
  return self;    
}

- (void)defaultsChanged:(NSNotification *)notification {
  // Get the user defaults
  NSUserDefaults *defaults = (NSUserDefaults *)[notification object];

  NSLog(@"%@", [defaults objectForKey:@"yourIntrestedObject"]);
}

- (void)dealloc {
 [[NSNotificationCenter defaultCenter] removeObserver:self];
}
于 2013-03-04T13:25:20.717 回答
22

使用 NSUserDefaultsDidChangeNotification 通知用户默认值的变化:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(defaultsDidChange:) name:NSUserDefaultsDidChangeNotification
    object:nil];

// notification
- (void)defaultsDidChange:(NSNotification *)aNotification
{
     //
}

使用 KVO 通知有关用户默认值的特定更改:

[[NSUserDefaults standardUserDefaults] addObserver:self 
    forKeyPath:@"APXMyPropertyIamInterestedInKey" options:NSKeyValueObservingOptionNew
    context:NULL];

// KVO handler
-(void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject
    change:(NSDictionary *)aChange context:(void *)aContext 
{
    // 
}
于 2013-03-04T13:33:36.630 回答
3

如果您需要在 Swift 4 项目中使用它,您可以使用以下内容:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(defaultsChanged), name: UserDefaults.didChangeNotification, object: nil)
}

@objc func defaultsChanged() {
    // Your code
}
于 2018-06-03T16:29:52.347 回答
2

在 Xcode 帮助中,UserDefaults类的概述(的 swifty 名称NSUserDefaults)清楚地指出:

您可以使用键值观察来为感兴趣的特定键注册观察者,以便在本地默认数据库的所有更新时收到通知。有关详细信息,请参阅键值观察编程指南。”

我会看看我是否能想出一个快速的代码示例,但是堆栈溢出必须在 swift 中充满 KVO 示例。

于 2017-01-09T17:15:52.000 回答
1

这是我发布的关于如何在 Swift 中执行此操作并获取 userInfo 的解决方案:

如何确定 iOS 上的设置何时更改

于 2015-11-15T16:35:32.957 回答