iOS: use um booleano em NSUserDefaults

88

Quando o rootViewControllerdo meu aplicativo for carregado, quero poder verificar se as credenciais de login dos usuários foram salvas ou não NSUserDefaults.

Basicamente, quando o usuário carrega o aplicativo e não tem suas credenciais de login salvas, um modalAlertViewserá enviado e o usuário poderá salvar suas credenciais de forma adequada. Isso salva essas UITextFieldstrings em um respectivo NSUserDefaultobjeto. No entanto, é possível, que quando esse salvamento for feito, eu possa criar um NSUserDefaultobjeto que é booleano e alterar o valor para sim?

O que significa que o booleano já está definido como não e quando o usuário salva suas credenciais de login, ele também muda o booleano para sim?

Sebastien Peek
fonte

Respostas:

263

Você pode definir seu booleano usando:

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

[[NSUserDefaults standardUserDefaults] synchronize];

e leia usando este código:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Henrik P. Hessel
fonte
@Henril P. Pode exibir o mesmo usuário que estava conectado anteriormente
Ajay
10

Existe um método em NSUserDefaultschamado registerDefaults:. Você usa este método para definir os "padrões padrão" do seu aplicativo. Basicamente, você cria um NSDictionarycontendo suas chaves e valores padrão (no seu caso, um NÃO para uma chave de "credenciais salvas") e o registra usando registerDefaults:. Isso geralmente é feito no + (void)initializemétodo do delegado do aplicativo para garantir que seus padrões sejam registrados antes de serem necessários. Esses valores são usados ​​apenas se seu aplicativo não os substituiu. Em outras palavras, eles não serão usados ​​a menos que a chave que você está procurando não esteja no Domínio do Aplicativo, ou seja, os padrões do usuário lidos do arquivo .plist do usuário.

Por outro lado, você pode apenas verificar as credenciais de login e exibir um alerta se elas estiverem faltando. Isso elimina a necessidade de manter seu valor booleano sincronizado com as credenciais de login. Se você fornecer posteriormente um recurso de "excluir credenciais de login", não precisará se lembrar de definir o booleano de volta para NÃO. Se suas credenciais de login forem salvas nos padrões do usuário, você faria o seguinte:

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
fonte
como escreveria um método que verifica as credenciais de login e apenas exibe o alerta se elas não forem salvas?
Sebastien Peek
4
Você não deve nem pensar em armazenar senhas em NSUserDefaults.
Krzysztof Przygoda
6

Esta solução, sugerida por Henrik P. Hessel:

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

funcionaria no seu caso, mas tenha em mente que você não deve verificar com este código se alguma chave for definida, porque se ela realmente for definida e definida como "NÃO", você ainda obterá um resultado como se não fosse definido em tudo. Em vez disso, eu usaria

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

Você não precisa primeiro configurá-lo para NO, em vez disso, você pode verificar se uma chave foi configurada. Caso contrário, e se seu aplicativo determinar que as credenciais estão completas, basta criá-lo e defini-lo como YES.

Verifique minha resposta a outra pergunta para ver como costumo fazer isso.

Toastor
fonte
0

em 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 e object(forKey:)então lançá-lo em bool

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

Swift 2.3

Para armazenar 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 armazenar valores

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

para recuperar valores

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