2013-03-04 83 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的名稱)的概述中明確規定:

你可以使用鍵值觀察來爲觀察者註冊特定的感興趣的關鍵字,以便將所有更新通知給本地默認數據庫。有關詳細信息,請參閱鍵 - 值觀察編程指南「。

我去看看我能想出一個快速的代碼示例,但堆棧溢出必須充滿迅速志願樣本。