0

我正在尝试检查在应用程序的生命周期中是否曾经加载过某个视图。我已经实现了以下代码,但不太确定它为什么不起作用。它仅在视图控制器的 viewDidLoad 方法中完成(也许这是问题所在)。如果有人可以让我知道我的错误是什么,将不胜感激。谢谢!

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
 BOOL hasRunBefore = [defaults boolForKey:@"FirstRun"];
                     if (hasRunBefore) {
                         NSLog (@"not the very first time this controller has been loaded");
                          [defaults setBool:YES forKey:@"FirstRun"];
                         [defaults synchronize];
                     }
                     else if (!hasRunBefore) {
                         [defaults setBool:NO forKey:@"FirstRun"];
                          NSLog (@"the very first time this controller has been loaded");
                         [defaults synchronize];
                     }
4

3 回答 3

2

您的代码中有几个错误。请参阅以下更正:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL hasRunBefore = [defaults boolForKey:@"FirstRun"];

if (hasRunBefore) {
    NSLog (@"not the very first time this controller has been loaded");
    /* Toggle the boolean state */
    [defaults setBool:NO forKey:@"FirstRun"];
}
else if (!hasRunBefore) {
    /* Toggle the boolean state */
    [defaults setBool:YES forKey:@"FirstRun"];
    NSLog (@"the very first time this controller has been loaded");
}
[defaults synchronize];

但是,我不确定为什么要在 if(hasRunBefore) 中将 FirstRun 切换回 NO。我只指出出了什么问题,您可能需要再次检查您的逻辑。

- 编辑 - 就像我指出你的逻辑一样,你应该只有这个:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL hasRunBefore = [defaults boolForKey:@"FirstRun"];

if (!hasRunBefore) {
    [defaults setBool:YES forKey:@"FirstRun"];
    [defaults synchronize];
    NSLog (@"the very first time this controller has been loaded");
}
else
    NSLog (@"Not the first time this controller has been loaded");
于 2012-08-11T03:37:34.923 回答
1

只要应用程序安装在设备上,默认设置的值就会保持不变。

您应该考虑使用应用程序委托中设置的 BOOL 值(从运行到运行不会持续存在)

或者

您应该通过以下方法在您的应用程序委托中将“FirstRun”设置回 NO。

- (void)applicationWillTerminate:(UIApplication *)application
于 2012-08-11T01:56:25.527 回答
1

NSUserDefaults 是可能的,但您也可以使用静态BOOL并将其设置YES为第一次加载视图控制器时。

于 2012-08-11T02:04:10.950 回答