当我将一个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。
答案 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) {
//
}