我想在应用程序第一次启动时只打开一次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?
已经遵循了以上和许多其他链接。我在这里失踪了什么? 谢谢,
答案 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"]