2013-03-04 3 views
19

Я разрабатываю приложение iOS с последним SDK.Обнаруживать изменения в NSUserDefaults

Я хочу знать, когда свойство на NSUserDefaults изменяет его значение.

Я нашел this, но оно специфично для MAC:

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

Как я могу сделать это на прошивке?

ответ

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

+0

Возможно, вы можете дать второе решение @Dmitry попробовать. – CarlJ

+0

этот код имеет проблему, notifictionCenter выиграл ' t фактически имеет объект NSUSerDefaults, потому что объект равен нулю. Единственный способ получить объект уведомления, который должен быть отправлен в пределах центра уведомлений, - это заполнить параметр объекта: – TheM00s3

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

+0

Пробовал подход 'KVO' и использовать' removeObserver: forKeyPath: 'метод в' dealloc'. Когда точка выполнения достигает значения «removeObserver: forKeyPath», приложение выдает исключение, говоря: «Невозможно удалить наблюдателя ... потому что он не зарегистрирован в качестве наблюдателя». – steveluoxin

0

В Xcode помощи, обзор UserDefaults класса (Swifty имя для NSUserDefaults) ясно сказано:

Вы можете использовать наблюдение за ключевыми значениями для регистрации наблюдателей для конкретных ключей, представляющих интерес, чтобы получать уведомления обо всех обновлениях локальной базы данных по умолчанию. Для получения более подробной информации см Key-Value Соблюдая Руководство по программированию.»

Я посмотрю, смогу ли я придумать быстрый пример кода, но стек переполнения должен быть полон образцов КВО в Свифт.

Смежные вопросы