2010-08-25 6 views
43

El título de la pregunta casi lo delata. Me gustaría que mi aplicación recuerde algunas cosas. Es una especie de calculadora, por lo que debe guardar los últimos valores utilizados y algunas configuraciones seleccionables por el usuario.¿Cómo guardo las preferencias de usuario para mi aplicación de iPhone?

Básicamente me gustaría guardar un puñado de flotadores y BOOL y cargarlos nuevamente la próxima vez que se cargue la aplicación.

¿Cuál es la mejor y más fácil manera de hacerlo?

Gracias!

Respuesta

125

Una de las maneras más fáciles se ahorra en el NSUserDefaults:

Marco:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

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

Conseguir:

[[NSUserDefaults standardUserDefaults] objectForKey:key]; 

– boolForKey: 

y

– floatForKey: en su caso.

+0

perfecto! ¡Gracias! – Toastor

+1

'-setValue: forKey:' y '-valueForKey', respectivamente, también están bien. Además, siempre se realiza una copia de seguridad de 'standardUserDefaults' cuando se sincroniza un iDevice. Esto es genial si quieres incluir compras en la aplicación. – SK9

+0

Gracias perfecto trabajando muy bien –

6

Además del muy buen enfoque NSUserDefaults, hay otra manera fácil de almacenar datos de un NSArray, NSDictionary o NSData en un archivo. Puede utilizar estos métodos, así:

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

respectivamente (para una NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path 

sólo hay que darle una ruta válida a una ubicación. De acuerdo con la Guía de programación de aplicaciones de iOS, el directorio/Library/Caches sería el mejor lugar para almacenar los datos que necesita para mantenerse entre los lanzamientos de la aplicación. (Ver here)

Con el fin de guardar/cargar un diccionario de un presentadas llamados "gestores" en su documento directoy usted podría utilizar estos métodos:

-(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]; 
    } 
} 

De todos modos este enfoque es muy limitado y hay que gastar mucho trabajo extra si desea almacenar datos más complejos. En ese caso, la API CoreData es muy útil.

+0

Las preferencias del usuario no son realmente documentos. – SK9

+0

@ SK9: Señalé en la primera línea que solo estoy mostrando una alternativa al enfoque NSUserDefaults. No creas que es justo/necesario votar por abajo una alternativa válida. – Chris

+2

por ej. Desde su enlace a los documentos: "Si su aplicación crea archivos de datos grandes o ** archivos que cambian con frecuencia **, debe considerar almacenarlos en el directorio Inicio de la aplicación/Biblioteca/Caches y no en el directorio /Documentos La copia de seguridad de archivos de datos grandes puede ralentizar el proceso de copia de seguridad de manera significativa. Lo mismo ocurre con los archivos que cambian regularmente. Colocar estos archivos en el directorio Caches evita que se realicen copias de seguridad (en iOS 2.2 y posterior) durante cada operación de sincronización. – SK9

3

En Swift:

Configuración

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

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

Tenga en cuenta que para iOS 8 y versiones posteriores, llamando userDefaults.synchronize() es not recommended.

conseguir

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

Tenga en cuenta que userDefaults.boolForKey y userDefaults.floatForKey ambos devuelven valores no opcionales, por lo que nunca serían nil (sólo false o 0.0).

Otras lecturas

Cuestiones relacionadas