NSNotFound 不适用于 NSUser 默认值

NSNotFound not working with NSUser default

因为我将一个整数值存储到 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:

-integerForKey: is equivalent to -objectForKey:, except that it converts the returned value to an NSInteger. If the value is an NSNumber, the result of -integerValue will be returned. If the value is an NSString, it will be converted to NSInteger if possible. If the value is a boolean, it will be converted to either 1 for YES or 0 for NO. If the value is absent or can't be converted to an integer, 0 will be returned.

如果你想检查 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 仅存储对象,NSNumbers。 我认为从 NSNumber 转换的问题,您在方法 integerForKey 中将其存储为整数。

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

显然有一个误解:NSNotFound不等于缺少key,是一个合法的整数值

保持逻辑的最简单方法是将 key-value 对注册为默认值 NSNotFound

尽快(applicationDidFinishLaunching或更早)写

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

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

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

PS:写完就不用synchronize了。该框架会定期执行此操作。