standard nsuserdefault example iphone objective-c nsuserdefaults

iphone - example - NSUserDefaults: cómo saber si existe una clave



userdefaults standard set swift 4 (11)

" objectForKey devolverá nil si no existe " . También devolverá nil si existe y es un número entero o booleano con un valor de cero (es decir, FALSO o NO para el booleano).

He probado esto en el simulador para 5.1 y 6.1. Esto significa que realmente no se puede probar si se han establecido enteros o valores booleanos al pedir "el objeto". Puede evitar esto con los enteros si no le importa tratar "no establecido" como si estuviera "establecido en cero".

Las personas que ya probaron esto parecen haber sido engañadas por el aspecto falso negativo, es decir, comprobando si objectForKey devuelve nulo cuando sabe que no se ha establecido la clave, pero no se da cuenta de que también devuelve nulo si la clave ha sido establecido, pero se ha establecido en NO.

Por mi propio problema, que me envió aquí, acabé cambiando la semántica de mi booleano para que mi valor predeterminado deseado estuviera en congruencia con el valor establecido en NO. Si esa no es una opción, tendrá que almacenar como algo distinto a un booleano y asegurarse de que puede distinguir entre SÍ, NO y "no establecido".

Estoy trabajando en una pequeña aplicación para iPhone y estoy usando NSUserDefaults como la persistencia de mis datos. Solo tiene que hacer un seguimiento de algunas cosas, como algunos nombres y algunos números, así que imagino que es mejor que sea sencillo.

Encontré esta página para alguna referencia, pero no creo que pueda responder a mi pregunta. Básicamente, quiero poder verificar si ya existe un valor (o una clave) en el NSUserDefaults y luego hacer algo en consecuencia.

Algunos ejemplos: la aplicación se inicia, si esta es la primera vez que se inicia, se emite una alerta que dice "Bienvenido". Para saber si es la primera vez que se abre, lee los UserDefaults del UserDefaults y los comprueba.

Ejemplo 2: Dice "Hola [Nombre]", donde Nombre es algo que ingresaste. Si ha abierto la aplicación y no hay nombre, debería decir "Hola mundo". Necesito verificar si ya ha ingresado un nombre y actuar en consecuencia. El nombre se almacenaría en NSUserDefaults .

¿Alguna ayuda aquí? ¡Realmente lo apreciaría!


¿Versión Swift para obtener Bool?

NSUserDefaults.standardUserDefaults().objectForKey(DefaultsIsGiver) as? Bool


Acabo de pasar por esto y todas sus respuestas me ayudaron a encontrar una buena solución para mí. Me resistí a seguir el camino sugerido, solo porque me resultaba difícil de leer y comprender.

Esto es lo que hice. Tuve un BOOL siendo transportado en una variable llamada "_talkative".

Cuando configuro mi objeto predeterminado (NSUserDefaults), lo configuro como un objeto, ya que luego podría probar si era nulo:

//converting BOOL to an object so we can check on nil [defaults setObject:@(_talkative) forKey:@"talkative"];

Luego, cuando fui a ver si existía, usé:

if ([defaults objectForKey:@"talkative"]!=nil ) {

Luego usé el objeto como BOOL:

if ([defaults boolForKey:@"talkative"]) { ...

Esto parece funcionar en mi caso. Simplemente tenía más sentido visual para mí.


Como se mencionó anteriormente, no funcionará para los tipos primitivos donde 0 / NO podría ser un valor válido. Estoy usando este código.

NSUserDefaults *defaults= [NSUserDefaults standardUserDefaults]; if([[[defaults dictionaryRepresentation] allKeys] containsObject:@"mykey"]){ NSLog(@"mykey found"); }


El método objectForKey: devolverá nil si el valor no existe. Aquí hay una prueba IF / THEN simple que le dirá si el valor es nulo:

if([[NSUserDefaults standardUserDefaults] objectForKey:@"YOUR_KEY"] != nil) { ... }


En Swift3, lo he usado de esta manera.

var hasAddedGeofencesAtleastOnce: Bool { get { return UserDefaults.standard.object(forKey: "hasAddedGeofencesAtleastOnce") != nil } }

La answer es excelente si vas a usar eso varias veces.

Espero que ayude :)


Extienda UserDefaults una vez para no copiar y pegar esta solución:

extension UserDefaults { func hasValue(forKey key: String) -> Bool { return nil != object(forKey: key) } } // Example UserDefaults.standard.hasValue(forKey: "username")


Prueba este pequeño crumpet:

-(void)saveUserSettings{ NSNumber* value; value = [NSNumber numberWithFloat:self.sensativity]; [[NSUserDefaults standardUserDefaults] setObject:value forKey:@"sensativity"]; } -(void)loadUserSettings{ NSNumber* value; value = [[NSUserDefaults standardUserDefaults] objectForKey:@"sensativity"]; if(value == nil){ self.sensativity = 4.0; }else{ self.sensativity = [value floatValue]; } }

Trata todo como un objeto. Parece funcionar para mi.


Swift 3.0

if NSUserDefaults.standardUserDefaults().dictionaryRepresentation().contains({ $0.0 == "Your_Comparison_Key" }){ result = NSUserDefaults.standardUserDefaults().objectForKey(self.ticketDetail.ticket_id) as! String }


objectForKey: devolverá nil si no existe.


Swift 3/4:

Aquí hay una extensión simple para los tipos de valor-clave Int / Double / Float / Bool que imitan el comportamiento de retorno Opcional de los otros tipos a los que se accede a través de UserDefaults.

( Editar agosto 30 2018: actualizado con una sintaxis más eficiente de la sugerencia de Leo).

extension UserDefaults { /// Convenience method to wrap the built-in .integer(forKey:) method in an optional returning nil if the key doesn''t exist. func integerOptional(forKey: String) -> Int? { return self.object(forKey: forKey) as? Int } /// Convenience method to wrap the built-in .double(forKey:) method in an optional returning nil if the key doesn''t exist. func doubleOptional(forKey: String) -> Double? { return self.object(forKey: forKey) as? Double } /// Convenience method to wrap the built-in .float(forKey:) method in an optional returning nil if the key doesn''t exist. func floatOptional(forKey: String) -> Float? { return self.object(forKey: forKey) as? Float } /// Convenience method to wrap the built-in .bool(forKey:) method in an optional returning nil if the key doesn''t exist. func boolOptional(forKey: String) -> Bool? { return self.object(forKey: forKey) as? Bool } }

Ahora son más consistentes junto con los otros métodos incorporados de obtención (cadena, datos, etc.). Solo usa los métodos get en lugar de los viejos.

let AppDefaults = UserDefaults.standard // assuming the key "Test" does not exist... // old: print(AppDefaults.integer(forKey: "Test")) // == 0 // new: print(AppDefaults.integerOptional(forKey: "Test")) // == nil