2013-03-04 8 views
19

Pracuję nad aplikacją iOS z najnowszym pakietem SDK.Wykrywanie zmian w NSUserDefaults

Chcę wiedzieć, kiedy właściwość na NSUserDefaults zmienia jej wartość.

znalazłem this, ale jest specyficzne dla MAC:

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

Jak mogę to zrobić na iOS?

Odpowiedz

34

wypróbować NSUserDefaultsDidChangeNotification z tym fragmencie kodu:

- (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

Dziękuję bardzo za odpowiedź.Jeśli chcę otrzymywać powiadomienia tylko wtedy, gdy zmieniają się określone klucze, jak mogę to zrobić? – VansFannel

+0

może możesz dać @Dmitry drugie rozwiązanie, spróbuj – CarlJ

+0

ten kod ma problem, notifictionCenter wygrał ' t rzeczywiście mają obiekt NSUSerDefaults, ponieważ obiekt jest zerowy.Jedynym sposobem, aby obiekt powiadomienia został wysłany w centrum powiadomień, jest wypełnienie obiektu: parametr: – TheM00s3

17

Zastosowanie NSUserDefaultsDidChangeNotification dla zawiadomienia o zmianie domyślnych użytkowniczki:

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

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

Korzystanie KVO powiadamiania o konkretnej zmiany domyślnych ustawień użytkownika:

[[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

Uważam, że w iOS 7 KVO działa dobrze w aplikacji, ale nie działa, jeśli parametr keyPath został zmieniony przez Ustawienia. – SwiftArchitect

+0

Próbowałem metody 'KVO' i użyłem metody' removeObserver: forKeyPath: 'w' dealloc'. Gdy punkt wykonywania osiągnie wartość 'removeObserver: forKeyPath', aplikacja zgłasza wyjątek, mówiąc: ** Nie można usunąć obserwatora ... ponieważ nie jest zarejestrowany jako obserwator. ** – steveluoxin

0

w Xcode pomoc, opis z UserDefaults klasy (The swifty nazwa dla NSUserDefaults) wyraźnie stwierdza:

Można użyj obserwacji wartości klucz-wartość, aby zarejestrować obserwatorów dla określonych kluczy, aby otrzymywać powiadomienia o wszystkich aktualizacjach lokalnej bazy danych domyślnych. Aby uzyskać więcej informacji, zobacz klucz-wartość Obserwując Programming Guide „.

Zobaczę, czy uda mi się wymyślić szybkiego code-próbki, lecz stosu-przelewowy musi być pełne próbek KVO w SWIFT.