iOS: Використовуйте логічне значення в NSUserDefaults


88

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

В основному, коли користувач завантажує додаток, і він / вона не зберігає свої облікові дані для входу, modalAlertViewбуде натиснуто a , і користувач зможе належним чином зберегти свої облікові дані. Це зберігає ці UITextFieldрядки у відповідному NSUserDefaultоб’єкті. Однак чи можливо, що коли це збереження буде зроблено, я можу створити NSUserDefaultоб'єкт, який є логічним значенням, і змінити значення на так?

Це означає, що для логічного значення вже встановлено значення ні, і коли користувач зберігає свої облікові дані для входу, він також змінює логічне значення на так?

Відповіді:


263

Ви можете встановити своє логічне значення, використовуючи:

[[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

Існує метод у NSUserDefaultsвикликається registerDefaults:. Ви використовуєте цей метод, щоб встановити "програму за замовчуванням за замовчуванням". По суті, ви створюєте, що NSDictionaryмістить ваші ключі та значення за замовчуванням (у вашому випадку - НІ для ключа "збережені облікові дані"), і реєструєте його за допомогою registerDefaults:. Це часто робиться в + (void)initializeметоді делегата програми, щоб переконатися, що ваші значення за замовчуванням реєструються до того, як вони знадобляться. Ці значення використовуються лише в тому випадку, якщо програма не замінила їх. Іншими словами, вони не будуть використовуватися, якщо ключ, який ви шукаєте, не знаходиться в Домені програми, тобто користувач за замовчуванням читає з файлу .plist користувача.

З іншого боку, ви можете просто перевірити наявність облікових даних для входу та з’явити попередження, якщо вони відсутні. Це позбавляє від необхідності синхронізувати логічне значення з обліковими даними для входу. Якщо пізніше ви надасте можливість "видалити облікові дані для входу", вам не доведеться пам'ятати про те, щоб встановити для логічного значення значення НІ. Якщо ваші облікові дані для входу зберігаються за замовчуванням користувача, ви зробите наступне:

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.
Кшиштоф Пшигода

6

Це рішення, запропоноване Хенріком П. Гесселем:

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

у вашому випадку буде працювати, але майте на увазі, що ви не повинні перевіряти за допомогою цього коду, чи встановлено якийсь ключ взагалі, тому що якщо він насправді встановлений і встановлений у "НІ", ви все одно отримаєте результат, як ніби ні встановити взагалі. Натомість я б використав

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:)а потім відкинути його

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

-1

Свіфт 2.3

Для зберігання цінностей

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

Для отримання значень

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

Свіфт 3.0

Для зберігання цінностей

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

для отримання значень

  UserDefaults.standard().bool(forKey: "logged_in"){
      dashboardScreen()
  }else {
      loginScreen()
  }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.