2010-08-25 12 views
43

Il titolo della domanda praticamente lo dona - vorrei che la mia app ricordasse alcune cose. È una sorta di calcolatrice, quindi dovrebbe salvare gli ultimi valori utilizzati e alcune impostazioni selezionabili dall'utente.Come posso salvare le preferenze dell'utente per la mia app per iPhone?

Fondamentalmente vorrei salvare una manciata di float e BOOL e caricarli di nuovo la prossima volta che l'applicazione viene caricata.

Qual è il modo migliore e più semplice per farlo?

Grazie !!

risposta

125

Uno dei modi più semplici sarebbe salvarlo nella NSUserDefaults:

Ambito:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

[userDefaults setObject:value 
       forKey:key]; 
// – setBool:forKey: 
// – setFloat:forKey: 
// in your case 
[userDefaults synchronize]; 

Ottenere:

[[NSUserDefaults standardUserDefaults] objectForKey:key]; 

– boolForKey: 

e

– floatForKey: nel tuo caso.

+0

Perfetto! Grazie! – Toastor

+1

'-setValue: forKey:' e '-valueForKey', rispettivamente, vanno bene. Inoltre, "standardUserDefaults" viene sempre eseguito il backup quando un iDevice viene sincronizzato. Questo è ottimo se vuoi includere gli acquisti in-app. – SK9

+0

Grazie perfetto perfettamente funzionante –

6

Oltre all'ottimo approccio NSUserDefaults, esiste un altro modo semplice per archiviare i dati da un NSArray, NSDictionary o NSData in un file. È possibile utilizzare questi metodi così:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag 

rispettivamente (per un NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path 

devi solo dare un percorso valido a una posizione. Secondo la Guida alla programmazione delle applicazioni iOS, la directory/Library/Caches sarebbe il posto migliore in cui archiviare i dati che è necessario mantenere tra l'avvio dell'app. (Vedi here)

Per memorizzare/caricare un dizionario da un archiviato chiamato "manager" del documento Directoy si potrebbe utilizzare questi metodi:

-(void) loadDictionary { 
    //get the documents directory: 
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cacheDirectory = [paths objectAtIndex:0]; 
    //create a destination file name to write the data : 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory]; 
    NSDictionary* panelLibraryContent = [NSDictionary dictionaryWithContentsOfFile:fullFileName]; 
    if (panelLibraryContent != nil) { 
     // load was successful do something with the data... 
    } else { 
     // error while loading the file 
    } 
} 

-(void) storeDictionary:(NSDictionary*) dictionaryToStore { 
    //get the documents directory: 
    NSArray *paths = NSSearchPathForDirectoriesInDomains 
    (NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *cacheDirectory = [paths objectAtIndex:0]; 
    //make a file name to write the data to using the 
    //cache directory: 
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory]; 

    if (dictionaryToStore != nil) { 
     [dictionaryToStore writeToFile:fullFileName atomically:YES]; 
    } 
} 

Comunque questo approccio è molto limitata e si deve dedicare molto lavoro extra se si desidera archiviare dati più complessi. In tal caso l'API CoreData è molto utile.

+0

Le preferenze dell'utente non sono proprio documenti. – SK9

+0

@ SK9: ho sottolineato nella prima riga che sto solo mostrando un'alternativa all'approccio NSUserDefaults. Non è giusto/necessario votare una valida alternativa. – Chris

+2

es. Dal tuo link ai documenti - "Se la tua applicazione crea file di dati di grandi dimensioni o ** file che cambiano frequentemente **, dovresti considerare di archiviarli nella directory Home page/Libreria/Cache dell'applicazione e non nella directory /Documenti Il backup di file di dati di grandi dimensioni può rallentare notevolmente il processo di backup, lo stesso vale per i file che cambiano regolarmente.Posizionare questi file nella directory Caches impedisce loro di eseguire il backup (in iOS 2.2 e versioni successive) durante ogni operazione di sincronizzazione. " – SK9

3

In Swift:

Impostazione

let userDefaults = NSUserDefaults.standardUserDefaults() 
userDefaults.setObject(value, forKey: key) 

// userDefaults.setFloat(12.34, forKey: "myFloatKey") 
// userDefaults.setBool(true, forKey: "myBoolKey") 

Si noti che per iOS 8 e versioni successive, chiamando userDefaults.synchronize() è not recommended.

Getting

let userDefaults = NSUserDefaults.standardUserDefaults() 
if let value = userDefaults.objectForKey(key) { 
    print(value) 
} 

noti che userDefaults.boolForKey e userDefaults.floatForKey entrambi restituiscono valori non opzionali, in modo da non sarebbero mai nil (solo false o 0.0).

Ulteriore lettura

Problemi correlati