使用 storyboardID 检测首次启动

using storyboardID to detect first launch

使用 NSUserDefaults,如果是第一次启动,我可以显示一个视图,如果不是,我可以显示另一个视图。我的问题是,无论如何,该程序都认为它是第一次启动。我的代码如下(在我的AppDelegate.m文件中):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen ]bounds]];

    NSString *storyboardID;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    bool hasLaunched = [defaults boolForKey:@"hasLaunched"];

    if (!hasLaunched) {
        storyboardID = @"firstLaunch";
        hasLaunched = YES;
        [defaults synchronize];

    }

    else {
        storyboardID = @"notFirstLaunch";
    }


    UIStoryboard *main = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    UIViewController *viewController = [main instantiateViewControllerWithIdentifier:storyboardID];

    UINavigationController * navControl = [[UINavigationController alloc]initWithRootViewController:viewController];

        self.window.rootViewController = navControl;

        [self.window makeKeyAndVisible];

    return YES;
}

我正在以编程方式创建导航控制器。另一件奇怪的事情是,第一个启动视图控制器(总是显示)上面有一个透明的导航栏。但是,当我推送到另一个视图控制器(通过呈现它)时,第二个视图控制器顶部没有导航栏。考虑到我正在将导航控制器移至新的视图控制器,我不确定为什么会这样。

您正在将局部变量 hasLaunched 设置为 YES,但您并未将此变量存储在 NSUserDefaults -

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

bool hasLaunched = [defaults boolForKey:@"hasLaunched"];

if (!hasLaunched) {
    storyboardID = @"firstLaunch";
    [defaults setBool:YES forKey:@"hasLaunched"];
}
else {
    storyboardID = @"notFirstLaunch";
}

你的第二个问题我不是很明白。我建议你再问一个问题,并附上你的问题的屏幕截图。