无法保存NSUserDefaults值iOS

时间:2014-03-31 05:52:05

标签: ios objective-c nsuserdefaults

我想在应用程序第一次启动时只打开一次ViewController。以下是我的代码。问题是当我向 NSUserdefaults 写“是”,执行同步,然后关闭应用程序时。在Xcode中使用模拟器,该值不会更新为是。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isFirstLaunch"])
    {
        // app already launched
        [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO],@"isFirstLaunch", nil]];
        [[NSUserDefaults standardUserDefaults]synchronize];
    }

    else
    {
        [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"isFirstLaunch", nil]];
        [[NSUserDefaults standardUserDefaults]synchronize];
    }

    return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
   if ([[NSUserDefaults standardUserDefaults] boolForKey:@"isFirstLaunch"])
   {
            NSLog(@"first time");
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    LASplashUserSettingViewController *splash = [storyboard instantiateViewControllerWithIdentifier:@"splash"];
    [self.window.rootViewController presentViewController:splash animated:NO completion:nil];//
   }

}

Why is NSUserDefaults not saving my values?

已经遵循了以上和许多其他链接。我在这里失踪了什么? 谢谢,

3 个答案:

答案 0 :(得分:2)

  

我在这里缺少什么?

-registerDefaults: doesn't do what you think it does。请改用-setBool:forKey:

-registerDefaults:用于确保默认系统中某些键的值存在。在该方法之后无需调用-synchronize,因为注册域中的值永远不会保存。您可能打算使用该方法为YES设置默认值isFirstLaunch,但是您的代码会在注册默认值之前检查键的值!这违背了方法的目的。正确使用是先调用-registerDefaults:,然后检查与密钥关联的值,如果值为YES,则调用-setBool:forKey:以保存值NO

检测第一次发射的一个更简单的选择是反转问题。完全跳过-registerDefaults:来电并将密钥更改为appHasRunPreviously。如果没有为给定密钥存储任何值,-boolForKey:将返回NO。如果发生这种情况,您知道这是应用首次运行,您应该使用YES为该密钥保存-setBool:forKey:

答案 1 :(得分:0)

这是您在AppDelegate.m中使用NSUserDefaults的方式

+ (void)initialize 
{
    // Register defaults for first time
    NSMutableDictionary *defs = [NSMutableDictionary dictionary];
    [defs setObject:[NSNumber numberWithBool:YES] forKey:@"isFirstLaunch"];
    [[NSUserDefaults standardUserDefaults] registerDefaults:defs];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if([defaults boolForKey:@"isFirstLaunch"])
    {
        // Do your stuff here

        [defaults setBool:NO forKey:@"isFirstLaunch"];
        [defaults synchronize];
    }
}

如果您只想让视图显示一次,请不要在else条件中将isFirstLaunch设置回YES。

答案 2 :(得分:-2)

你可以试试这个

 [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"AlreadyLaunched"];


 [[NSUserDefaults standardUserDefaults]boolForKey:@"AlreadyLaunched"]