【问题标题】:Unable to save NSUserDefaults values iOS无法保存 NSUserDefaults 值 iOS
【发布时间】:2014-03-31 05:52:05
【问题描述】:

我只想在应用程序第一次启动时打开一次 ViewController。下面是我的代码。问题是当我写 YES 到 NSUserdefaults ,做一个 synchronize ,然后关闭应用程序。在使用模拟器的 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];//
   }

}

Why is NSUserDefaults not saving my values?

已关注上述和许多其他链接。我在这里想念什么? 谢谢,

【问题讨论】:

    标签: ios objective-c nsuserdefaults


    【解决方案1】:

    我在这里错过了什么?

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

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

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

    【讨论】:

      【解决方案2】:

      这就是你在 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。

      【讨论】:

        【解决方案3】:

        你可以试试这个

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-03
          • 1970-01-01
          • 2013-10-09
          • 1970-01-01
          • 2013-04-16
          • 1970-01-01
          • 2012-02-20
          相关资源
          最近更新 更多