iOS: Gunakan boolean di NSUserDefaults

88

Saat rootViewControlleraplikasi saya dimuat, saya ingin dapat memeriksa apakah kredensial login pengguna telah disimpan ke NSUserDefaults.

Pada dasarnya, ketika pengguna memuat aplikasi dan dia tidak menyimpan kredensial loginnya, a modalAlertViewakan didorong dan pengguna akan dapat menyimpan kredensial mereka dengan tepat. Ini menyimpan UITextFieldstring tersebut ke NSUserDefaultobjek masing-masing . Namun, apakah mungkin, saat penyimpanan ini selesai, saya bisa membuat NSUserDefaultobjek yang berupa boolean dan mengubah nilainya menjadi ya?

Artinya, boolean sudah disetel ke no, dan saat pengguna menyimpan kredensial loginnya, boolean juga akan diubah menjadi ya?

Sebastien Peek
sumber

Jawaban:

264

Anda dapat menyetel boolean Anda dengan menggunakan:

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

[[NSUserDefaults standardUserDefaults] synchronize];

dan membacanya dengan menggunakan kode ini:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
    [self displayLogin];
} else {
    [self displayMainScreen];
}
Henrik P. Hessel
sumber
@Henril P. Bisakah itu menampilkan pengguna yang sama yang login sebelumnya
Ajay
10

Ada metode dalam NSUserDefaultsmemanggil registerDefaults:. Anda menggunakan metode ini untuk menyetel "default default" aplikasi Anda. Pada dasarnya, Anda membuat yang NSDictionaryberisi kunci dan nilai default Anda (dalam kasus Anda, NO untuk kunci "kredensial yang disimpan"), dan Anda mendaftarkannya menggunakan registerDefaults:. Ini jika sering dilakukan dalam + (void)initializemetode delegasi aplikasi untuk memastikan bahwa default Anda telah terdaftar sebelum diperlukan. Nilai-nilai ini hanya digunakan jika aplikasi Anda belum menggantinya. Dengan kata lain, mereka tidak akan digunakan kecuali kunci yang Anda cari tidak ada dalam Domain Aplikasi, yaitu, default pengguna membaca dari file .plist pengguna.

Di sisi lain, Anda bisa saja memeriksa kredensial masuk dan memunculkan peringatan jika hilang. Ini menghilangkan keharusan untuk tetap menyinkronkan nilai boolean Anda dengan kredensial login. Jika nanti Anda memberikan kemampuan "hapus kredensial login", Anda tidak perlu ingat untuk menyetel kembali boolean ke NO. Jika kredensial login Anda disimpan di default pengguna, Anda akan melakukan ini:

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
sumber
bagaimana saya akan menulis metode yang memeriksa kredensial login dan hanya memunculkan peringatan jika tidak disimpan?
Sebastien Peek
4
Anda bahkan tidak perlu berpikir untuk menyimpan kata sandi di NSUserDefaults.
Krzysztof Przygoda
6

Solusi ini, disarankan oleh Henrik P. Hessel:

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

akan berfungsi dalam kasus Anda, tetapi perlu diingat bahwa Anda tidak boleh memeriksa dengan kode ini jika beberapa kunci disetel sama sekali, karena jika sebenarnya disetel dan disetel ke "TIDAK", Anda masih akan mendapatkan hasil seolah-olah tidak diatur sama sekali. Sebaliknya saya akan menggunakan

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

Anda tidak perlu menyetelnya terlebih dahulu NO, sebagai gantinya Anda dapat memeriksa apakah ada kunci yang disetel sama sekali. Jika tidak, dan jika aplikasi Anda menentukan bahwa kredensial sudah lengkap, buat saja dan setel ke YES.

Periksa jawaban saya untuk pertanyaan lain untuk melihat bagaimana saya biasanya melakukan ini.

Toastor
sumber
0

di Swift 3

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

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

alternatifnya kita bisa gunakan object(forKey:)lalu cast ke bool

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

Swift 2.3.0

Untuk menyimpan nilai

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

Untuk mengambil nilai

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

Swift 3.0.0

Untuk menyimpan nilai

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

untuk mengambil nilai

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