iOS: используйте логическое значение в NSUserDefaults

88

Когда rootViewControllerприложение моего приложения загружено, я хочу иметь возможность проверить, были ли сохранены учетные данные пользователя для входа в систему NSUserDefaults.

В основном, когда пользователь загружает приложение и у него / нее нет сохраненных учетных данных для входа, modalAlertViewбудет отправлено сообщение, и пользователь сможет сохранить свои учетные данные соответствующим образом. Это сохраняет эти UITextFieldстроки в соответствующем NSUserDefaultобъекте. Однако возможно ли, что когда это сохранение будет выполнено, я смогу создать NSUserDefaultобъект, который является логическим, и изменить значение на да?

Это означает, что для логического значения уже установлено значение «нет», и когда пользователь сохраняет свои учетные данные для входа в систему, он также изменяет логическое значение на «да»?

Себастьян Пик
источник

Ответы:

264

Вы можете установить логическое значение, используя:

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

[[NSUserDefaults standardUserDefaults] synchronize];

и прочтите его, используя этот код:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Хенрик П. Хессель
источник
@Henril P. Может ли он отображать того же пользователя, который ранее входил в систему
Ajay
10

Есть метод в NSUserDefaultscalled registerDefaults:. Вы используете этот метод, чтобы установить для вашего приложения «значения по умолчанию». По сути, вы создаете NSDictionaryфайл, содержащий ключи и значения по умолчанию (в вашем случае НЕТ для ключа «сохраненных учетных данных»), и регистрируете его с помощью registerDefaults:. Это часто делается в + (void)initializeметоде делегата приложения, чтобы убедиться, что ваши значения по умолчанию зарегистрированы до того, как они понадобятся. Эти значения используются только в том случае, если ваше приложение их не заменило. Другими словами, они не будут использоваться, если ключ, который вы ищете, не находится в Домене приложения, т. Е. Пользовательские значения по умолчанию читаются из пользовательского файла .plist.

С другой стороны, вы можете просто проверить учетные данные для входа и отобразить предупреждение, если они отсутствуют. Это избавляет от необходимости синхронизировать логическое значение с учетными данными для входа. Если позже вы предоставите возможность «удалить учетные данные для входа», вам не нужно будет помнить, что для логического значения нужно вернуть значение NO. Если ваши учетные данные сохранены в настройках пользователя по умолчанию, вы должны сделать это:

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
}
Джеймс Хаддлстон
источник
как мне написать метод, который проверяет учетные данные для входа и просто выдает предупреждение, если они не сохранены?
Себастьян Пик
4
Не стоит даже думать о хранении паролей в NSUserDefaults.
Krzysztof Przygoda
6

Это решение, предложенное Хенриком П. Хесселем:

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

будет работать в вашем случае, но имейте в виду, что вы не должны проверять с помощью этого кода, установлен ли какой-либо ключ вообще, потому что, если он действительно установлен и установлен на "NO", вы все равно получите результат, как если бы не был ставил вообще. Вместо этого я бы использовал

if([[NSUserDefaults standardUserDefaults] objectForKey:@"logged_in"] == nil) {
    //Do something
}
Шиим
источник
2

Вам не нужно сначала устанавливать его NO, вместо этого вы можете проверить, был ли ключ вообще установлен. Если нет, и если ваше приложение определяет, что учетные данные полны, просто создайте его и установите для него YES.

Проверьте мой ответ на другой вопрос, чтобы узнать, как я обычно это делаю.

Тостор
источник
0

в Swift 3

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

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

в качестве альтернативы мы можем использовать object(forKey:)затем преобразовать его в bool

if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true {
  displayMainScreen()
} else {
  displayLoginScreen() 
}
Сухит Патил
источник
-1

Swift 2.3

Для хранения значений

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

Для получения значений

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

Swift 3.0

Для хранения значений

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

получить значения

  UserDefaults.standard().bool(forKey: "logged_in"){
      dashboardScreen()
  }else {
      loginScreen()
  }
Адитья
источник