NSNotFound不能与NSUser一起使用默认

问题描述:

因为我在一个Integer值中存储一个Integer值到NSUserDefaults,在很多地方使用它。在第一次的工作正常,但同时我关闭我的应用程序,然后再次打开它,我检查已经选择在过去feom NSUserDefaults储值的任何选项,用户,但我没在NSNotFound不能与NSUser一起使用默认

有些事情是错误的,我的情况下

这里是我的检查整数值的代码是在有userdefault

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

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

但它总能找到价值,即使我正在删除应用程序,并reinastall它。

总是我的选定值是。

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

编辑:

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

THNAKS。

+0

朋友你可以显示你的setInteger:forKey代码? –

+0

我相信你在设定价值时做错了什么。 –

+1

请考虑'NSNotFound'是一个有效的整数值。这不等于'nil'或*键丢失*。正如答案中所述,如果密钥丢失,'integerForKey'返回0。根本不同的标签分配给'sender'(默认也是0)? – vadian

显然有一个误区:NSNotFound不等于密钥丢失,这是一个有效的整数值。

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

尽快(applicationDidFinishLaunching或更早)写

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

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

现在你可以在问题中使用你的逻辑。注:写完后你不需要synchronize。该框架定期进行。

+0

Thaks为您的答案让我检查。 – BhaviDev

+0

太棒了! !它的工作完美,学到了新东西,我们可以像这样注册默认值许多感谢瓦迪亚。 – BhaviDev

+0

@BhaviDev我不明白为什么你每次都得到零值,即使我的代码在我的情况下工作。 –

为整数。缺省值是0,根据文档:

-integerForKey:相当于-objectForKey :,不同之处在于它转换返回的值到一个NSInteger。如果值为 NSNumber,则会返回-integerValue的结果。如果值 是一个NSString,则它将在可能的情况下转换为NSInteger。如果 的值是一个布尔值,则它将被转换为1或YES,如果是 NO。如果该值不存在或无法转换为整数,则返回0将返回 。

如果要检查是否有键NSUserDefaults的存在

使用:

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

但我的价值是整数不以对象的形式,所以它会与intergerForKey一起工作吗? – BhaviDev

+1

你可以尝试将它保存为NSNumber而不是NSInteger,然后在结果对象上使用intValue,而不是像这样保存:setObject:@(integer),它会给你一个更好的结果 – unkgd

+0

是的,我知道我可以使用NSNumber insted整数,但我的问题是有什么办法来检查整数有价值或不像NSNotFound工作与整数值。 – BhaviDev

您可以设置对象像

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

,你可以检查这样

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

我们如何直接存储Integer,因为在设置对象和传递Integer时,这不起作用。 – BhaviDev

+2

'NSUserDefaults'有专用的'setInteger:forKey'和'integerForKey:'方法。不需要使用'object'。 – vadian

+0

你可以设置整数对象像@(整数)或[NSNumber numberWithInt:0]或[NSNumber numberWithInteger:0] – zapdroid

NSUserDefaults存储唯一对象,NSNumbers。 我认为在NSNumber转换的问题,你存储为方法integerForKey整数。

另一种情况 - 可能你忘了同步NSUserDefaults