2013-03-04 84 views
19

我正在开发具有最新SDK的iOS应用程序。检测NSUserDefaults上的更改

我想知道什么时候NSUserDefaults上的房产改变了它的价值。

我发现this,但它为Mac是具体的:

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

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

回答

34

试用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]; 
} 
+0

非常感谢您的回答。如果我想只在特定密钥更改时收到通知,我该怎么办? – VansFannel 2013-03-04 16:55:05

+0

也许您可以给@Dmitry第二个解决方案一试 – CarlJ 2013-03-04 17:02:42

+0

此代码有问题,notifictionCenter赢得' t实际上有一个NSUSerDefaults对象,因为该对象是nil。通知对象被发布到notificationCenter中的唯一方法是填写对象:参数 – TheM00s3 2015-06-04 17:31:03

17

使用NSUserDefaultsDidChangeNotification约在用户违约变更通知:在用户默认

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

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

使用志愿有关特定变更通知:

[[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 
{ 
    // 
} 
+6

我发现,在iOS 7中,KVO在应用程序内运行良好,但如果keyPath由设置更改,则不起作用。 – SwiftArchitect 2014-05-11 16:31:45

+0

尝试过'KVO'方法,并在'dealloc'中使用'removeObserver:forKeyPath:'方法。当执行点到达'removeObserver:forKeyPath'时,应用程序会抛出一个异常,说**不能删除观察者...因为它没有注册为观察者。** – steveluoxin 2017-10-17 02:07:52

0

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

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

我去看看我能想出一个快速的代码示例,但堆栈溢出必须充满迅速志愿样本。