NSNotFound不支持NSUser默认值

时间:2017-02-20 12:48:05

标签: ios objective-c nsuserdefaults

当我将一个Integer值存储到NSUserDefaults时,它在很多地方使用。在第一次工作正常,但当我关闭我的应用程序并再次打开它时,我检查用户是否已选择过去的feom NSUserDefaults存储值中的任何选项,但我失败了

我的情况有些不对劲

以下是检查整数值的代码 userdefault

NSInteger selectedBusinessUnit = [[NSUserDefaults standardUserDefaults] integerForKey:@"selectedUnit"];

if ( selectedBusinessUnit != NSNotFound){
    //go to direct main screen.
}else {
 // load Business unit screen for selection.
}

但它总能找到价值,即使我正在删除应用并重新播放它。

我选择的值始终为 0

让我知道这里的愚蠢错误。

修改

[[NSUserDefaults standardUserDefaults] setInteger:sender.tag forKey:@"selectedUnit"];
[[NSUserDefaults standardUserDefaults] synchronize];

THNAKS。

4 个答案:

答案 0 :(得分:2)

显然存在一个误解:NSNotFound不等于键丢失,它是一个有效的整数值。

保持逻辑的最简单方法是将NSNotFound注册为键值对作为默认值。

尽快(applicationDidFinishLaunching或更早)写

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *defaultValues = @{@"selectedUnit": @(NSNotFound)};
[defaults registerDefaults:defaultValues];

这意味着NSNotFound被视为默认值,直到第一次被覆盖为止。每次应用程序启动时都必须执行3行。如果重新安装该应用程序,则会再次使用默认值。

现在你可以在问题中使用你的逻辑了。

PS:写完后你不需要synchronize。该框架定期进行。

答案 1 :(得分:1)

根据文档:

,整数的默认值为0
  

-integerForKey:相当于-objectForKey :,除了它将返回的值转换为NSInteger。如果值是   NSNumber,将返回-integerValue的结果。如果值   是NSString,如果可能,它将被转换为NSInteger。如果   value是一个布尔值,它将转换为1表示YES或0表示   没有。如果该值不存在或无法转换为整数,则0将   被退回。

如果要检查NSUserDefaults中是否存在密钥,请使用:

if ([[NSUserDefaults standardUserDefaults] objectForKey:@"selectedUnit"] != nil)
{
...
}

答案 2 :(得分:0)

NSUserDefaults仅存储对象NSNumbers。 我认为从NSNumber转换的问题,您在方法integerForKey中存储为整数。

另一个案例 - 可能是您忘记了同步NSUserDefaults

答案 3 :(得分:-1)

您可以将对象设置为

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@(yourIntegerValue) forKey:@"yourIntegerKey"];
[userDefaults synchronize];

你可以这样查看

NSNumber *integerValue = [userDefaults objectForKey:@"yourIntegerKey"];
if (integerValue) {
   //
}