检测NSUserDefaults上的更改

时间:2013-03-04 13:22:26

标签: ios objective-c nsuserdefaults

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

我想知道NSUserDefaults上的某个属性何时更改其值。

我找到this,但它特定于macOS:

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

如何在iOS上执行此操作?

5 个答案:

答案 0 :(得分:35)

使用以下代码片段试用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];
}

答案 1 :(得分:18)

使用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 
{
    // 
}

答案 2 :(得分:2)

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

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

@objc func defaultsChanged() {
    // Your code
}

答案 3 :(得分:1)

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

How to determine when Settings change on iOS

答案 4 :(得分:1)

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

  

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

我会看看我是否可以提出快速的代码示例,但堆栈溢出必须在swift中充满KVO样本。