iOS: Sử dụng boolean trong NSUserDefaults


88

Khi rootViewControllerứng dụng của tôi được tải, tôi muốn có thể kiểm tra xem thông tin đăng nhập của người dùng đã được lưu vào hay chưa NSUserDefaults.

Về cơ bản, khi người dùng tải ứng dụng và họ không lưu thông tin đăng nhập của mình, a modalAlertViewsẽ được đẩy và người dùng sẽ có thể lưu thông tin đăng nhập của họ một cách thích hợp. Thao tác này lưu các UITextFieldchuỗi đó vào một NSUserDefaultđối tượng tương ứng . Tuy nhiên, có khả năng là khi quá trình lưu này hoàn tất, tôi có thể tạo một NSUserDefaultđối tượng là boolean và thay đổi giá trị thành yes không?

Có nghĩa là boolean đã được đặt thành không và khi người dùng lưu thông tin đăng nhập của họ, nó cũng thay đổi boolean thành yes?

Câu trả lời:


263

Bạn có thể đặt boolean của mình bằng cách sử dụng:

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

[[NSUserDefaults standardUserDefaults] synchronize];

và đọc nó bằng cách sử dụng mã này:

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

@Henril P. Nó có thể hiển thị cùng một người dùng đã đăng nhập trước đó không
Ajay

10

Có một phương thức trong NSUserDefaultsđược gọi registerDefaults:. Bạn sử dụng phương pháp này để đặt "giá trị mặc định" cho ứng dụng của mình. Về cơ bản, bạn tạo một NSDictionarychứa các khóa và giá trị mặc định của mình (trong trường hợp của bạn là KHÔNG cho khóa "thông tin đăng nhập đã lưu") và bạn đăng ký bằng cách sử dụng registerDefaults:. Điều này nếu thường được thực hiện trong + (void)initializephương thức của ủy viên ứng dụng để đảm bảo rằng các giá trị mặc định của bạn đã được đăng ký trước khi chúng cần thiết. Những giá trị này chỉ được sử dụng nếu ứng dụng của bạn không thay thế chúng. Nói cách khác, chúng sẽ không được sử dụng trừ khi khóa bạn đang tìm kiếm không nằm trong Miền ứng dụng, tức là người dùng mặc định đọc từ tệp .plist của người dùng.

Mặt khác, bạn có thể chỉ cần kiểm tra thông tin đăng nhập và bật lên một cảnh báo nếu chúng bị thiếu. Điều này giúp loại bỏ nhu cầu giữ giá trị boolean của bạn được đồng bộ hóa với thông tin đăng nhập. Nếu sau đó bạn cung cấp khả năng "xóa thông tin đăng nhập", bạn sẽ không phải nhớ đặt boolean trở lại NO. Nếu thông tin đăng nhập của bạn được lưu ở chế độ mặc định của người dùng, bạn sẽ thực hiện việc này:

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
}

Tôi sẽ viết một phương pháp kiểm tra thông tin đăng nhập và chỉ bật lên cảnh báo nếu chúng chưa được lưu?
Sebastien Peek

4
Bạn thậm chí không nên nghĩ đến việc lưu trữ mật khẩu trong NSUserDefaults.
Krzysztof Przygoda

6

Giải pháp này, do Henrik P. Hessel đề xuất:

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

sẽ hoạt động trong trường hợp của bạn, nhưng hãy nhớ rằng bạn không nên kiểm tra bằng mã này nếu một số khóa được đặt ở tất cả, bởi vì nếu nó thực sự được đặt và đặt thành "KHÔNG", bạn sẽ vẫn nhận được kết quả như thể không thiết lập ở tất cả. Thay vào đó tôi sẽ sử dụng

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

2

Trước tiên NO, bạn không cần đặt nó thành , thay vào đó, bạn có thể kiểm tra xem khóa đã được đặt chưa. Nếu không và nếu ứng dụng của bạn xác định thông tin đăng nhập đã hoàn tất, chỉ cần tạo và đặt nó thành YES.

Kiểm tra câu trả lời của tôi cho một câu hỏi khác để xem cách tôi thường làm việc này.


0

trong Swift 3

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

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

cách khác, chúng ta có thể sử dụng object(forKey:)rồi truyền nó thành bool

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

-1

Swift 2.3

Để lưu trữ các giá trị

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

Để tìm nạp các giá trị

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

Swift 3.0

Để lưu trữ các giá trị

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

để lấy các giá trị

  UserDefaults.standard().bool(forKey: "logged_in"){
      dashboardScreen()
  }else {
      loginScreen()
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.