iOS:在NSUserDefaults中使用布尔值

问题描述 投票:85回答:6

加载我的应用程序的rootViewController时,我希望能够检查用户登录凭据是否已保存到NSUserDefaults

基本上,当用户加载应用程序并且他/她没有保存她的登录凭据时,将推送modalAlertView并且用户将能够适当地保存他们的凭证。这将UITextField字符串保存到相应的NSUserDefault对象。但是,有可能,当这个保存完成后,我可以创建一个布尔值的NSUserDefault对象并将值更改为是吗?

这意味着布尔值已经设置为no,并且当用户保存其登录凭据时,它还将布尔值更改为是?

iphone objective-c boolean nsuserdefaults modalviewcontroller
6个回答
254
投票

您可以使用以下命令设置布尔值:

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

[[NSUserDefaults standardUserDefaults] synchronize];

并使用此代码阅读:

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

10
投票

NSUserDefaults有一种叫做registerDefaults:的方法。您可以使用此方法设置应用程序的“默认默认值”。基本上,您创建一个包含默认键和值的NSDictionary(在您的情况下为“已保存的凭据”键为NO),并使用registerDefaults:进行注册。这通常在app delegate的+ (void)initialize方法中完成,以确保在需要之前注册您的默认值。只有在您的应用尚未替换它们时才会使用这些值。换句话说,除非您要查找的密钥不在应用程序域中,否则将不会使用它们,即,用户默认从用户的.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
}

6
投票

这个解决方案由Henrik P. Hessel建议:

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

可以在你的情况下工作,但请记住,如果设置了一些键,你不应该检查这个代码,因为如果它实际设置并设置为“NO”,你仍然会得到一个结果,好像不是完全没有。相反,我会用

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

2
投票

您不需要先将其设置为NO,而是可以检查是否已设置密钥。如果没有,并且您的应用确定凭据已完成,只需创建它并将其设置为YES

检查my answer to another question,看看我通常如何做到这一点。


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:)然后将它投射到bool

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

-1
投票

斯威夫特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()
  }
© www.soinside.com 2019 - 2024. All rights reserved.