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

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

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

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


person Sebastien Peek    schedule 01.10.2010    source источник


Ответы (6)


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

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

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

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

В NSUserDefaults есть метод под названием 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
}
person James Huddleston    schedule 01.10.2010
comment
как мне написать метод, который проверяет учетные данные для входа и просто выдает предупреждение, если они не сохранены? - person Sebastien Peek; 01.10.2010
comment
Не стоит даже думать о хранении паролей в NSUserDefaults. - person Krzysztof Przygoda; 13.05.2014

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

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

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

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

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

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

person Toastor    schedule 01.10.2010

в 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() 
}
person Suhit Patil    schedule 05.01.2017

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()
  }
person Aditya    schedule 18.10.2016