web-dev-qa-db-fra.com

iOS: Utiliser un booléen dans NSUserDefaults

Lorsque la rootViewController de mon application est chargée, je souhaite pouvoir vérifier si les informations de connexion des utilisateurs ont été enregistrées dans NSUserDefaults.

Fondamentalement, lorsque l'utilisateur charge l'application et qu'il/elle n'a pas enregistré ses informations de connexion, une variable modalAlertView sera poussée et l'utilisateur pourra enregistrer leurs informations d'identification de manière appropriée. Cela enregistre ces chaînes UITextField dans un objet NSUserDefault respectif. Cependant, est-il possible que, lorsque cette sauvegarde soit effectuée, je puisse créer un objet NSUserDefault qui soit un booléen et remplacer la valeur par un oui?

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

84
Sebastien Peek

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

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

et le lire en utilisant ce code:

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

Il existe une méthode dans NSUserDefaults appelée registerDefaults:. Vous utilisez cette méthode pour définir les "valeurs par défaut" de votre application. Fondamentalement, vous créez une NSDictionary contenant 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:. Cette opération est souvent effectuée dans la méthode + (void)initialize du délégué de l'application pour garantir que vos valeurs par défaut sont enregistrées avant d'être utilisées. 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 figure 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 d'identification de connexion et afficher une alerte si elles sont manquantes. Ceci élimine la nécessité de garder votre valeur booléenne synchronisée avec les informations d'identification de connexion. Si, par la suite, vous fournissez une fonctionnalité "supprimer les identifiants de connexion", vous ne devrez pas vous rappeler de redéfinir le booléen sur NO. Si vos identifiants de connexion sont enregistrés dans les valeurs 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
}
10
James Huddleston

Cette solution, proposé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 définie et définie sur "NON", vous obtiendrez toujours un résultat comme si elle n'était mettre du tout. J'utiliserais plutôt

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

Vous n'avez pas besoin de le définir d'abord sur NO; vous pouvez plutôt 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 et définissez-la sur YES.

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

2
Toastor

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 lancer

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