可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
When the rootViewController
of my application is loaded, I want to be able to check whether or not the users login credentials have been saved to NSUserDefaults
.
Basically, when the user loads the application and he/she doesn't have her login credentials saved, a modalAlertView
will be pushed and the user will be able to save their credentials appropriately. This saves those UITextField
strings to a respective NSUserDefault
object. However, is it possible, that when this saving is done, I can create an NSUserDefault
object which is a boolean and change the value to a yes?
Meaning that the boolean is already set to no, and when the user saves their login credentials, it also changes the boolean to a yes?
回答1:
You can set your boolean by using:
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"logged_in"];
[[NSUserDefaults standardUserDefaults] synchronize];
and read it by using this code:
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
[self displayLogin];
} else {
[self displayMainScreen];
}
回答2:
There is a method in NSUserDefaults
called registerDefaults:
. You use this method to set your application's "default defaults." Basically, you create an NSDictionary
containing your default keys and values (in your case a NO for a "saved credentials" key), and you register it using registerDefaults:
. This if often done in app delegate's + (void)initialize
method to ensure that your defaults are registered before they are needed. These values only get used if your app hasn't replaced them. In other words, they won't be used unless the key you're looking for isn't in the Application Domain, i.e., the user defaults read from the user's .plist file.
On the other hand, you could just check for login credentials and pop up an alert if they're missing. This eliminates the need to keep your boolean value synchronized with the login credentials. If you later provide a "delete login credentials" capability, you won't have to remember to set the boolean back to NO. If your login credentials are saved in user's defaults, you'd do this:
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
}
回答3:
This solution, suggested by Henrik P. Hessel:
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"logged_in"]) {
[self displayLogin];
} else {
[self displayMainScreen];
}
would work in your case, but bear in mind that you shouldn't check with this code if some key is set at all, because if it actually is set and set to "NO", you would still get a result as if was not set at all. Instead I would use
if([[NSUserDefaults standardUserDefaults] objectForKey:@"logged_in"] == nil) {
//Do something
}
回答4:
You don't need to first set it to NO
, instead you may check if a key has been set at all. If not, and if your app determines the credentials are complete, just create it and set it to YES
.
Check my answer to another question to see how I usually do this.
回答5:
in Swift 3
let Defaults = UserDefaults.standard()()
let exists = Defaults.bool(forKey: "isLoggedIn")
if !exists {
displayLoginScreen()
} else {
print("value exists..do something")
displayMainScreen()
}
alternatively we can use object(forKey:)
then cast it to bool
if let exists = Defaults.object(forKey: "isLoggedIn"), let isLoggedIn = exists.boolValue where isLoggedIn == true {
displayMainScreen()
} else {
displayLoginScreen()
}
回答6:
Swift 2.3
To store values
NSUserDefaults.standardUserDefaults().setBool(false, forKey: "logged_in")
For fetching values
if NSUserDefaults.standardUserDefaults().boolForKey("logged_in") == true {
dashboardScreen()
}else {
loginScreen()
}
Swift 3.0
To store values
UserDefaults.standard().setBool(true, forKey: "logged_in")
to retrieve values
UserDefaults.standard().bool(forKey: "logged_in"){
dashboardScreen()
}else {
loginScreen()
}