0

我想在用户第一次运行我的应用程序时显示帮助覆盖。

为此,我在中使用以下代码didFinishLaunching

if(![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"IPHONEFIRSTRUN"])
    [[NSUserDefaults standardUserDefaults]setBool:TRUE forKey:@"IPHONEFIRSTRUN"];

在视图控制器中,我有:

if ([[NSUserDefaults standardUserDefaults]boolForKey:@"IPHONEFIRSTRUN"]==TRUE) {
    [self HelpOverlayIphone];
    [[NSUserDefaults standardUserDefaults]setBool:FALSE forKey:@"IPHONEFIRSTRUN"];
}

但是,它也显示了第二次使用的覆盖。我怎样才能解决这个问题?任何帮助表示赞赏。

4

3 回答 3

4

你的逻辑太复杂了。您正在永久设置用户默认值,以指示某事发生一次。相反,在视图控制器中查看该值是否未设置,如果是,请执行您的操作并设置变量,以便代码不再运行:

if ( ! [[NSUserDefaults standardUserDefaults]boolForKey:@"IPHONEFIRSTRUNCOMPLETE"] ) {
        [self HelpOverlayIphone];
        [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"IPHONEFIRSTRUNCOMPLETE"];
        [[NSUserDefaults standardUserDefaults] synchronize];
}

取出应用委托中的所有代码。

此外,您的原始代码很可能无法正常工作,因为您正在从 XCode 停止应用程序。如果您不使用synchronize用户默认更改,则在这种情况下将不会保存(正常退出应用程序最终会永久保存更改)。

于 2013-01-03T15:42:33.833 回答
0

您是否在程序开始时注册了您正在使用的默认值?我建议在这里重新阅读 NSUserDefaults 的苹果文档

您需要先拨打电话

- (void)registerDefaults:(NSDictionary *)dictionary

如果它不存在,它只会设置密钥。然后在第一次运行时检查密钥是否为假,并在此时设置它。

我的猜测是您的代码不起作用的原因是因为字典实际上从未以任何持久的方式保存。

于 2013-01-03T15:56:51.663 回答
0

我有这个功能,它会在应用程序启动时启动——它一直很可靠。我有一个 uniqueNameOfApp ,它只是一些随机散列,因此它不会与其他应用程序冲突。

-(void)loadSettings {
NSMutableDictionary *sttngs = [[NSUserDefaults standardUserDefaults] 
objectForKey:uniqueNameOfApp];

    if(sttngs != nil) {
    [userSettings addEntriesFromDictionary:sttngs];
    } else {
    _appFiredForFirstTime = YES;
    }
}
于 2013-01-03T16:00:40.670 回答