2013-03-04 22 views
19

Sto sviluppando un'applicazione iOS con l'ultimo SDK.Rileva modifiche su NSUserDefaults

Voglio sapere quando una proprietà su NSUserDefaults cambia valore.

ho trovato this, ma è specifico per MAC:

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

Come posso fare questo su iOS?

risposta

34

provare il NSUserDefaultsDidChangeNotification con questo frammento di codice:

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

Grazie mille per la tua risposta.Se voglio ricevere una notifica solo quando cambiano le chiavi specifiche, come posso fare? – VansFannel

+0

forse puoi dare una seconda soluzione a @Dmitry una prova. – CarlJ

+0

questo codice ha un problema, il notifictionCenter ha vinto t in realtà ha un oggetto NSUSerDefaults perché l'oggetto è nil. L'unico modo per ottenere l'oggetto di notifica da pubblicare all'interno di notificationCenter è di compilare l'oggetto: parametro. – TheM00s3

17

Usa NSUserDefaultsDidChangeNotification per la notifica dei cambiamenti in default Utente:

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

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

Usa KVO per la notifica di cambiamento specifico delle insolvenze utente:

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

Trovo che in iOS 7 KVO funzioni bene all'interno dell'app, ma non funziona se KeyPath viene modificato dalle Impostazioni. – SwiftArchitect

+0

Ho provato l'approccio 'KVO', e uso' removeObserver: forKeyPath: 'metodo in' dealloc'. Quando il punto di esecuzione raggiunge 'removeObserver: forKeyPath', l'app genera un'eccezione, dicendo ** Impossibile rimuovere un osservatore ... perché non è registrato come osservatore. ** – steveluoxin

0

In Xcode aiuto, la panoramica di UserDefaults di classe (il nome swifty per NSUserDefaults) afferma chiaramente:

Puoi utilizzare l'osservazione dei valori-chiave per registrare gli osservatori per specifiche chiavi di interesse al fine di ricevere una notifica di tutti gli aggiornamenti a un database di default locale. Per maggiori dettagli, vedere valore-chiave Osservando Guida alla programmazione ".

Vedrò se riesco a venire con un codice campione veloce, ma stack-trabocco deve essere pieno di campioni KVO a Swift.