iOS: utilisez un booléen dans NSUserDefaults

88

Lorsque le rootViewControllerde mon application est chargé, je souhaite pouvoir vérifier si les informations de connexion des utilisateurs ont été enregistrées ou non NSUserDefaults.

Fondamentalement, lorsque l'utilisateur charge l'application et qu'il / elle n'a pas ses informations de connexion enregistrées, un modalAlertViewsera poussé et l'utilisateur pourra enregistrer ses informations d'identification de manière appropriée. Cela enregistre ces UITextFieldchaînes dans un NSUserDefaultobjet respectif . Cependant, est-il possible qu'une fois cette sauvegarde terminée, je puisse créer un NSUserDefaultobjet booléen et changer la valeur en oui?

Cela signifie que le booléen est déjà défini sur non et que lorsque l'utilisateur enregistre ses informations de connexion, il change également le booléen en oui?

Sébastien Peek
la source

Réponses:

263

Vous pouvez définir votre valeur booléenne en utilisant:

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

[[NSUserDefaults standardUserDefaults] synchronize];

et lisez-le en utilisant ce code:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Henrik P. Hessel
la source
@Henril P .Peut-il afficher le même utilisateur que celui qui s'était connecté précédemment
Ajay
10

Il existe une méthode NSUserDefaultsappelée registerDefaults:. Vous utilisez cette méthode pour définir les «valeurs par défaut» de votre application. Fondamentalement, vous créez un NSDictionarycontenant vos clés et valeurs par défaut (dans votre cas, un NON pour une clé «informations d'identification enregistrées»), et vous l'enregistrez à l'aide de registerDefaults:. Cela est souvent fait dans la + (void)initializeméthode du délégué d'application pour garantir que vos valeurs par défaut sont enregistrées avant qu'elles ne soient nécessaires. Ces valeurs ne sont utilisées que si votre application ne les a pas remplacées. En d'autres termes, elles ne seront utilisées que si la clé que vous recherchez ne se trouve pas dans le domaine d'application, c'est-à-dire que les valeurs par défaut de l'utilisateur sont lues à partir du fichier .plist de l'utilisateur.

D'autre part, vous pouvez simplement vérifier les informations de connexion et afficher une alerte si elles sont manquantes. Cela élimine le besoin de garder votre valeur booléenne synchronisée avec les informations de connexion. Si vous fournissez par la suite une fonction de «suppression des informations de connexion», vous n'aurez pas à vous rappeler de remettre le booléen sur NO. Si vos informations de connexion sont enregistrées dans les paramètres par défaut de l'utilisateur, procédez comme suit:

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
la source
comment pourrais-je écrire une méthode qui vérifie les informations de connexion et affiche simplement l'alerte si elles ne sont pas enregistrées?
Sebastien Peek
4
Vous ne devriez même pas penser à stocker les mots de passe dans NSUserDefaults.
Krzysztof Przygoda
6

Cette solution, suggérée par Henrik P. Hessel:

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

fonctionnerait dans votre cas, mais gardez à l'esprit que vous ne devriez pas vérifier avec ce code si une clé est définie, car si elle est réellement définie et définie sur "NON", vous obtiendrez toujours un résultat comme si ce n'était pas le cas réglé du tout. Au lieu de cela, j'utiliserais

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

Vous n'avez pas besoin de le définir d'abord sur NO, mais vous pouvez vérifier si une clé a été définie. Sinon, et si votre application détermine que les informations d'identification sont complètes, créez-la simplement et définissez-la sur YES.

Vérifiez ma réponse à une autre question pour voir comment je le fais habituellement.

Toastor
la source
0

dans Swift 3

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

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

alternativement, nous pouvons utiliser object(forKey:)puis le convertir en booléen

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

Swift 2.3

Pour stocker des valeurs

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

Pour récupérer des valeurs

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

Swift 3.0

Pour stocker des valeurs

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

pour récupérer des valeurs

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