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?

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];
}

@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
}

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
}

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.


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() 
}

-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()
  }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.