无法保存NSUserDefaults值 iOS

3

当应用程序第一次启动时,我希望只打开一个ViewController。以下是我的代码。问题在于,当我将YES写入 NSUserDefaults ,进行同步,然后关闭应用程序时,在Xcode中使用模拟器,该值未更新为Yes。

- (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];//
   }

}

为什么NSUserDefaults无法保存我的值?

我查看了上面的链接以及许多其他链接,但是我错过了什么吗? 谢谢。

3个回答

2

我在这里错过了什么?

-registerDefaults: 并不是你想要的功能。请使用-setBool:forKey:代替。

-registerDefaults:用于确保默认系统中存在某些键的值。在调用该方法后无需调用-synchronize,因为注册域中的值从未保存。您可能希望使用该方法设置isFirstLaunch的默认值YES,但是您的代码在注册默认值之前检查了键的值!这违反了该方法的目的。正确的用法是首先调用-registerDefaults:,然后检查与键相关联的值,如果该值为YES,则调用-setBool:forKey:来保存值NO

检测第一次启动的一个更简单的选项是改变问题的反面。完全跳过-registerDefaults:调用,并将键更改为appHasRunPreviously。如果没有为给定键存储值,则-boolForKey:将返回NO。如果发生这种情况,则知道这是应用程序第一次运行,并且应使用-setBool:forKey:为该键保存YES


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
你可以试试这个。
 [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"AlreadyLaunched"];


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接