iOS: use un valor booleano en NSUserDefaults

88

Cuando rootViewControllerse cargue el de mi aplicación, quiero poder verificar si las credenciales de inicio de sesión de los usuarios se han guardado o no NSUserDefaults.

Básicamente, cuando el usuario carga la aplicación y él / ella no tiene sus credenciales de inicio de sesión guardadas, se modalAlertViewenviará un y el usuario podrá guardar sus credenciales de manera apropiada. Esto guarda esas UITextFieldcadenas en un NSUserDefaultobjeto respectivo . Sin embargo, ¿es posible que cuando se realice este guardado, pueda crear un NSUserDefaultobjeto que sea booleano y cambiar el valor a sí?

Lo que significa que el booleano ya está configurado en no, y cuando el usuario guarda sus credenciales de inicio de sesión, ¿también cambia el booleano a sí?

Sebastien Peek
fuente

Respuestas:

263

Puede configurar su booleano usando:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"logged_in"];

[[NSUserDefaults standardUserDefaults] synchronize];

y léelo usando este código:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Henrik P. Hessel
fuente
@Henril P. ¿Puede mostrar el mismo usuario que inició sesión anteriormente
Ajay
10

Hay un método en NSUserDefaultsllamado registerDefaults:. Utilice este método para establecer los "valores predeterminados predeterminados" de su aplicación. Básicamente, crea un NSDictionaryarchivo que contiene sus claves y valores predeterminados (en su caso, un NO para una clave de "credenciales guardadas"), y lo registra usando registerDefaults:. Esto se hace a menudo en el + (void)initializemétodo del delegado de la aplicación para garantizar que sus valores predeterminados se registren antes de que sean necesarios. Estos valores solo se utilizan si su aplicación no los ha reemplazado. En otras palabras, no se usarán a menos que la clave que está buscando no esté en el dominio de la aplicación, es decir, los valores predeterminados del usuario leídos del archivo .plist del usuario.

Por otro lado, simplemente puede verificar las credenciales de inicio de sesión y mostrar una alerta si faltan. Esto elimina la necesidad de mantener su valor booleano sincronizado con las credenciales de inicio de sesión. Si más tarde proporciona la capacidad de "eliminar credenciales de inicio de sesión", no tendrá que recordar volver a establecer el booleano en NO. Si sus credenciales de inicio de sesión se guardan en los valores predeterminados del usuario, haría esto:

NSString *userID = [[NSUserDefaults standardUserDefaults] stringForKey:@"userID"];
NSString *password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password"];
if (userID != nil && password != nil) {
    // Code to log user in
} else {
    // Code to pop up an alert
}
James Huddleston
fuente
¿Cómo haría para escribir un método que verifique las credenciales de inicio de sesión y simplemente muestre la alerta si no están guardadas?
Sebastien Peek
4
Ni siquiera debería pensar en almacenar contraseñas en NSUserDefaults.
Krzysztof Przygoda
6

Esta solución, sugerida por Henrik P. Hessel:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
[self displayLogin];
} else {
[self displayMainScreen];
}

funcionaría en su caso, pero tenga en cuenta que no debe verificar con este código si alguna clave está configurada, porque si realmente está configurada y configurada en "NO", aún obtendría un resultado como si no fuera establecer en absoluto. En su lugar, usaría

if([[NSUserDefaults standardUserDefaults] objectForKey:@"logged_in"] == nil) {
    //Do something
}
Shiim
fuente
2

No es necesario que lo configure primero NO, en su lugar, puede verificar si se ha configurado una clave. De lo contrario, y si su aplicación determina que las credenciales están completas, simplemente créala y configúrela en YES.

Verifique mi respuesta a otra pregunta para ver cómo suelo hacer esto.

Tostador
fuente
0

en Swift 3

let Defaults = UserDefaults.standard()()
let exists = Defaults.bool(forKey: "isLoggedIn")

if !exists {
   displayLoginScreen()            
} else {
   print("value exists..do something")
   displayMainScreen()       
}     

alternativamente, podemos usar y object(forKey:)luego lanzarlo a bool

if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true {
  displayMainScreen()
} else {
  displayLoginScreen() 
}
Suhit Patil
fuente
-1

Swift 2.3

Para almacenar valores

    NSUserDefaults.standardUserDefaults().setBool(false, forKey: "logged_in") 

Para buscar valores

  if NSUserDefaults.standardUserDefaults().boolForKey("logged_in") == true {
      dashboardScreen()
  }else {
      loginScreen()
  }

Swift 3.0

Para almacenar valores

  UserDefaults.standard().setBool(true, forKey: "logged_in")

para recuperar valores

  UserDefaults.standard().bool(forKey: "logged_in"){
      dashboardScreen()
  }else {
      loginScreen()
  }
Aditya
fuente