【问题标题】:iOS: Use a boolean in NSUserDefaultsiOS:在 NSUserDefaults 中使用布尔值
【发布时间】:2011-04-19 23:05:54
【问题描述】:

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

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

意味着布尔值已经设置为否,并且当用户保存他们的登录凭据时,它也会将布尔值更改为是?

【问题讨论】:

    标签: iphone objective-c boolean nsuserdefaults modalviewcontroller


    【解决方案1】:

    您可以使用以下方法设置布尔值:

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

    并使用以下代码阅读:

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

    【讨论】:

    • @Henril P . 它可以显示之前登录的同一个用户
    【解决方案2】:

    NSUserDefaults 中有一个方法叫registerDefaults:。您可以使用此方法设置应用程序的“默认默认值”。基本上,您创建一个包含默认键和值的NSDictionary(在您的情况下,“保存的凭据”键为“否”),然后使用registerDefaults: 注册它。如果经常在应用程序委托的+ (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
    }
    

    【讨论】:

    • 我将如何编写一个方法来检查登录凭据并在未保存时弹出警报?
    • 你甚至不应该考虑将密码存储在 NSUserDefaults 中。
    【解决方案3】:

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

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

    适用于您的情况,但请记住,如果设置了某个键,则不应检查此代码,因为如果它实际上已设置并设置为“NO”,您仍然会得到结果为if 根本没有设置。相反,我会使用

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

    【讨论】:

      【解决方案4】:

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

      查看my answer to another question 了解我通常如何执行此操作。

      【讨论】:

        【解决方案5】:

        在 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() 
        }
        

        【讨论】:

          【解决方案6】:

          斯威夫特 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()
            }
          

          【讨论】:

            猜你喜欢
            • 2012-09-14
            • 2011-08-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-20
            • 2010-12-27
            • 1970-01-01
            • 2012-01-06
            • 1970-01-01
            相关资源
            最近更新 更多