79

Khi ứng dụng rootViewController được tải, tôi muốn kiểm tra xem thông tin đăng nhập của người dùng đã được lưu vào NSUserDefaults hay chưa. Về cơ bản, khi người dùng tải ứng dụng và họ không có thông tin xác thực đăng nhập của mình được lưu, một số modalAlertView sẽ bị đẩy và người dùng 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 sẽ lưu các chuỗi UITextField này vào đối tượng NSUserDefault tương ứng. Tuy nhiên, có thể, khi tiết kiệm này được thực hiện, tôi có thể tạo một đối tượng NSUserDefault là một boolean và thay đổi giá trị thành có?iOS: Sử dụng boolean trong NSUserDefaults

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 có?

Trả lời

245

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

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

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

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

Mẹ kiếp bạn tốt! –

+0

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

2

Bạn không cần phải đầu tiên thiết lập nó để NO, thay vào đó bạn có thể kiểm tra nếu một khóa đã được đặt ở tất cả. 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 nó và đặt nó thành YES.

Kiểm tra my answer to another question để xem cách tôi thường làm điều này.

10

Có một phương thức trong NSUserDefaults được gọi là registerDefaults:. Bạn sử dụng phương pháp này để đặt "mặc định mặc định" của ứng dụng. Về cơ bản, bạn tạo một NSDictionary chứa các khóa và giá trị mặc định của bạn (trong trường hợp của bạn là KHÔNG cho khóa "ủy nhiệm đã lưu") và bạn đăng ký nó bằng cách sử dụng registerDefaults:. Điều này nếu thường được thực hiện trong phương thức + (void)initialize của đại biểu ứ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. Các 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 có trong Miền ứng dụng, tức là mặc định người dùng đọc từ tệp .plist của người dùng.

Mặt khác, bạn chỉ có thể kiểm tra thông tin xác thực đăng nhập và bật cảnh báo nếu thiếu. Điều này giúp loại bỏ sự cần thiết phải giữ giá trị boolean của bạn được đồng bộ hóa với các thông tin đăng nhập. Nếu sau này bạn cung cấp khả năng "xóa thông tin xác thực đăng nhập", bạn sẽ không phải nhớ đặt lại boolean thành NO. Nếu thông tin đăng nhập của bạn sẽ được lưu trong giá trị mặc định của người dùng, bạn muốn làm điều 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 
} 
+0

làm cách nào để tôi viết một phương pháp kiểm tra thông tin xác thực đăng nhập và chỉ bật lên cảnh báo nếu chúng không được lưu? –

+0

Xem câu trả lời được cập nhật. –

+4

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

5

Giải pháp này, được đề xuất bởi Henrik P. Hessel:

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

sẽ làm việc trong trường hợp của bạn, nhưng nhớ rằng bạn không nên kiểm tra với 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 thiết lập và thiết lập để "NO", bạn vẫn sẽ nhận được một kết quả như thể không được đặt ở tất cả. Thay vào đó, tôi sẽ sử dụng

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

Swift 2.3

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

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

Đối với các giá trị lấy

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 giá trị

UserDefaults.standard().bool(forKey: "logged_in"){ 
     dashboardScreen() 
    }else { 
     loginScreen() 
    } 
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:) sau đó bỏ nó vào bool

if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true { 
    displayMainScreen() 
} else { 
    displayLoginScreen() 
} 
Các vấn đề liên quan