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

มีวิธีการในการเป็นที่เรียกว่าNSUserDefaults registerDefaults:คุณใช้วิธีนี้เพื่อตั้งค่า "ค่าเริ่มต้นเริ่มต้น" ของแอปพลิเคชันของคุณ โดยทั่วไปคุณสร้างNSDictionaryที่มีปุ่มเริ่มต้นของคุณและค่านิยม (ในกรณีของคุณไม่หา "ข้อมูลประจำตัวที่บันทึกไว้" ที่สำคัญ) registerDefaults:และคุณลงทะเบียนโดยใช้ หากมักทำใน+ (void)initializeวิธีการของผู้แทนแอปเพื่อให้แน่ใจว่าค่าเริ่มต้นของคุณได้รับการลงทะเบียนก่อนที่จะจำเป็น ระบบจะใช้ค่าเหล่านี้หากแอปของคุณไม่ได้แทนที่ กล่าวอีกนัยหนึ่งคือจะไม่ถูกใช้เว้นแต่ว่าคีย์ที่คุณกำลังมองหาไม่ได้อยู่ใน Application Domain นั่นคือค่าเริ่มต้นของผู้ใช้จะอ่านจากไฟล์. 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
}

ฉันจะเขียนวิธีการตรวจสอบข้อมูลรับรองการเข้าสู่ระบบได้อย่างไรและเพิ่งปรากฏการแจ้งเตือนหากไม่ได้บันทึกไว้
Sebastien Peek

4
คุณไม่ควรคิดเกี่ยวกับการจัดเก็บรหัสผ่านใน NSUserDefaults
Krzysztof Przygoda

6

โซลูชันนี้แนะนำโดย Henrik P. Hessel:

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

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()
  }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.