NSUserDefaults registerDefaults设置初始BOOL - 确实存在BOOL值返回YES

时间:2016-01-31 05:05:05

标签: ios nsuserdefaults

我有NSUserDefaults设置代码

 NSDictionary *appDefaults = [NSDictionary
                             dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:@"DidBuyInAppPurchase"];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];

我稍后会检查:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DidBuyInAppPurchase"] == YES){//some code}

这是否意味着密钥存在BOOL或密钥设置为YES?

奇怪的是,我在viewDidLoad中编写的代码将BOOL设置为YES只是为了测试。在此之前,if-statement没有继续。现在它甚至在删除将standardUserDefaults设置为YES的代码时也会删除。即使我删除了应用程序并在设备上构建和运行,代码也会继续。

这表明if检查将YES与是否存在boolean值进行比较,并且以某种方式,YES也会持续删除应用程序。但是,应用程序的初始运行应该已经捕获了这个值,因为存在一个值。我检查了这个SO question,似乎if检查应检查YES值而不存在值。

这适用于IAP - 当用户购买时,boolean设置为YES以显示已购买,如果是,则向用户显示不同的viewControllers。如何正确设置,以便在检查时将设置设置为YES?

编辑:似乎这在iOS 8的模拟器中出现问题 - 默认情况下不从应用程序域中删除。不确定这是iOS 9设备上的情况,还是我错误地使用NSUserDefaults

2 个答案:

答案 0 :(得分:0)

当你使用-boolForKey:方法时,它在内部做两件事。首先,它查找键的对象,然后,它尝试从NSNumber对象中解包BOOL(返回该BOOL)。

如果该NSNumber不存在,则返回“否”。如果存在该NSNumber,则将返回该对象包装的布尔值。

要检查NSUserDefaults返回NO的原因,您可以使用相同的键调用-objectForKey:并简单地测试对象是否存在。

答案 1 :(得分:0)

Apple指出,用于导入预定义设置的方法不会保存任何内容,它只是将字典的条目添加到内存中的默认值。我没有在我的小显示屏上看到你的整个代码... -registerDefaults: