Ios NSNotFound无法使用NSUser默认值

Ios NSNotFound无法使用NSUser默认值,ios,objective-c,nsuserdefaults,Ios,Objective C,Nsuserdefaults,由于我正在将一个整数值存储到NSUserDefaultsaas中,因此在许多地方都会用到它。第一次它工作正常,但当我关闭应用程序并再次打开它时,我检查用户是否已经在过去的feomNSUserDefaults存储值中选择了任何选项,但我失败了 我的情况有些不对劲 下面是我的代码,用于检查用户默认值中是否存在整数值: NSInteger selectedBusinessUnit = [[NSUserDefaults standardUserDefaults] integerForKey:@"sele

由于我正在将一个整数值存储到
NSUserDefaults
aas中,因此在许多地方都会用到它。第一次它工作正常,但当我关闭应用程序并再次打开它时,我检查用户是否已经在过去的feom
NSUserDefaults
存储值中选择了任何选项,但我失败了

我的情况有些不对劲

下面是我的代码,用于检查用户默认值中是否存在整数值:

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.

根据文档,整数的默认值为0:

-IntegerWorkey:等效于-objectForKey:,只是它将返回值转换为NSInteger。如果该值为 NSNumber,将返回-integerValue的结果。如果值 是NSString,如果可能,将转换为NSInteger。如果 值是一个布尔值,它将被转换为1(是)或0(是) 否。如果该值不存在或无法转换为整数,则将0 被退回

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

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

根据文档,integer的默认值为0:

-IntegerWorkey:等效于-objectForKey:,只是它将返回值转换为NSInteger。如果该值为 NSNumber,将返回-integerValue的结果。如果值 是NSString,如果可能,将转换为NSInteger。如果 值是一个布尔值,它将被转换为1(是)或0(是) 否。如果该值不存在或无法转换为整数,则将0 被退回

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

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

可以将对象设置为

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@(yourIntegerValue) forKey:@"yourIntegerKey"];
[userDefaults synchronize];
你可以这样检查

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

可以将对象设置为

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@(yourIntegerValue) forKey:@"yourIntegerKey"];
[userDefaults synchronize];
你可以这样检查

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

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


另一种情况-可能是您忘记了同步
nsserdefaults

nsserdefaults
仅存储对象,
NSNumbers
。 我认为从
NSNumber
转换的问题在于,您在方法
integerworkey
中将其存储为整数


另一种情况-可能是您忘记了同步
NSUserDefaults
显然存在误解:
NSNotFound
不等于缺少键,它是一个有效的整数值

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

尽快(
ApplicationIDFinishLaunching
或更早)编写

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

现在你可以用你的逻辑来回答这个问题了


PS:您不需要在编写后进行
同步
。框架会定期这样做。

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

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

尽快(
ApplicationIDFinishLaunching
或更早)编写

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

现在你可以用你的逻辑来回答这个问题了


PS:您不需要在编写后进行
同步
。框架会定期这样做。

但是我的值是整数而不是对象的形式,因此它也可以与IntergerWorkey一起使用吗?您可以尝试将其保存为NSNumber而不是NSInteger,然后在生成的对象上使用intValue,只需这样保存:setObject:@(整数)它会给你一个更好的结果。我知道我可以用NSNumber代替integer,但我的问题是有没有办法检查integer是否有值,就像NSNotFound使用integer value一样。NSNotFound最终是一个整数,你的问题是默认整数值是0而不是NSNotFound,即使您使用整数作为NSUserDefaults的输入值,您仍然可以使用objectForKey检查它是否存在,如果存在,将返回NSNumber,否则返回nilBut我的值是整数而不是Object的形式,因此它是否也可以与IntergerWorkey一起使用??您可以尝试将其保存为NSNumber而不是NSInteger,然后在结果对象上使用intValue,只需按如下方式保存:setObject:@(integer),它将为您提供更好的结果。我知道我可以在integer上使用NSNumber,但我的问题是,是否有任何方法可以检查integer是否具有值。NSNotFound最终是一个整数,您的问题是默认整数值为0且未找到NSNotFound,即使您使用整数作为NSUserDefaults的输入值,您仍然可以使用objectForKey检查它是否存在,如果存在,将返回NSNumber,否则,我们如何直接存储整数,因为您正在设置对象并传递整数,这将不起作用。
NSUserDefaults
具有专用的
setInteger:forKey
IntegerWorkey:
方法。无需使用
对象
。您可以将整数设置为对象,如@(整数)或[NSNumber numberWithInt:0]或[NSNumber numberWithInteger:0]当然,我知道,我们可以将整数设置为nsu