【问题标题】:NSUserDefaults: How to get valueNSUserDefaults:如何获取价值
【发布时间】:2017-06-07 20:15:53
【问题描述】:

我是 iOS 的新手,Object-C,我正在尝试使用 NSUserDefaults 进行简单的登录/注册登录。

我的问题是:如何访问/获取保存在 NSUserDefaults 中的值以验证用户是否已经存在?

这是注册新用户的代码:

-(void)registerNewUser {

// Getting username and the password
NSString *newUsername = self.usernameRegisterTextField.text;
NSString *newPassword = self.passwordRegisterTextField.text;

// Using NSUserDefaults to storage username and password
NSUserDefaults *newUser = [NSUserDefaults standardUserDefaults];

[newUser setObject:newUsername forKey:@"username"];
[newUser setObject:newPassword forKey:@"password"];
[newUser setBool:YES forKey:@"registered"];

[newUser synchronize];

[self performSegueWithIdentifier:@"registerSucessSegue" sender:nil];

}

我正在尝试获取保存在 NSUserDefaults 中的值来验证用户是否已经存在,而不是再次调用登录屏幕:

- (IBAction)productTableButton:(id)sender {
// Verification if an user exist
NSUserDefaults *newUser = [NSUserDefaults standardUserDefaults];

BOOL newUserExist = [newUser valueForKey:@"registered"];

if (newUserExist == YES) {
    [self performSegueWithIdentifier:@"productSegue" sender:nil];
} else {
    [self performSegueWithIdentifier:@"loginSegue" sender:nil];
}

}

当我尝试访问保存在 NSUserDefaults 中的用户的值时,我做错了什么吗?

【问题讨论】:

  • 永远不要使用valueForKey 来获得BOOL,顺便说一句,无论如何不要使用valueForKeyNSUserDefaults。有boolForKey

标签: objective-c nsuserdefaults


【解决方案1】:

是的。 valueForKey 返回对象,而不是像 BOOL 这样的原始数据类型。 对于NSUserDefaults,获得BOOL 值的最短方法是改用boolForKey

【讨论】:

    【解决方案2】:

    您可以随时查看objectForKey,它可以安全地用于任何可能与您的密钥关联的类型。

    如果之前已经设置了密钥,它将返回一个id;否则,它将返回 nil。如果它是一个布尔值,你会得到一个可以轻松转换的 NSNumber。

    id someKey = [[NSUserDefaults standardUserDefaults] objectForKey:@"Key"];
    if(someKey)
    {
        //User exists
    }
    else
    {
        //User doesn't exist
    }
    

    【讨论】:

    • "objectForKey,可安全用于任何可能与您的密钥关联的类型。"对不起,这是不正确的。 objectForKey 仅适用于对象,不适用于 BOOL 等原始数据类型。
    • 我知道为什么人们不赞成这个答案。这个答案回答了OP的问题。他想知道如何检查用户是否存在,这可以通过检查该键是否存在于 userdefaults 中来完成,这就是这个答案的作用。
    • @moonman239 BOOL 和 int 等原始数据都存储为 NSNumber,因为 NSDictionaries 无法处理原始数据。 ObjectForKey 在这种情况下确实有效;唯一的区别是 boolForKey 会自动为您执行从 NSNumber 到 BOOL 的转换。这是公认的方法:stackoverflow.com/questions/4635106/…
    • @David:抱歉,我现在无法撤消我的反对意见。无论如何,您的初读答案似乎暗示 objectForKey 返回 BOOL 类型而不是 NSNumber 对象。
    【解决方案3】:

    尝试使用boolForKey获取值:

    BOOL newUserExist = [defaults boolForKey:@"registered"];

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2015-09-15
      • 2020-07-30
      • 2021-09-02
      • 2017-10-01
      • 2018-04-07
      • 2021-12-26
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多