2

有没有办法从 App Delegate 有条件地加载视图控制器?

例如,这可以做到吗?

    if (hasUserSignedUp) {
        nav = [[navController alloc] initWithNibName:nil bundle:nil];
        [window addSubview:nav.view];
        [window makeKeyAndVisible];
    }
    else {
        su = [[SignUpViewController alloc] initWithNibName:nil bundle:nil];
        [window addSubview:su.view];
        [window makeKeyAndVisible];
    }
4

4 回答 4

1

是的,这很方便,您这样做没有任何限制。

但我认为,您最好设置 rootViewController 而不是添加视图。

self.window.rootViewController = nav;//or su;
于 2012-04-13T23:34:08.130 回答
1

虽然这当然是可能的,但更好的主意是在两种情况下都加载您的导航控制器,并根据他们是否已注册,使用不同的根视图控制器。

if (hasUserSignedUp) {
    nav = [[UINavigationController alloc] initWithRootViewController:rootViewController];
}
else {
    su = [[SignUpViewController alloc] initWithNibName:nil bundle:nil];
    nav = [[UINavigationController alloc] initWithRootViewController:su];
}

[window addSubview:nav.view];
[window makeKeyAndVisible];

应用程序删除应该创建视图层次结构的根,然后您可以从那里按照您认为合适的方式对其进行操作。

如果我是你,我会使用上面的代码,一旦他们登录或注册,推送常规根视图控制器,然后修改导航堆栈堆栈:

[self.navigationController pushViewController:rootViewController animated:YES];

double delayInSeconds = 0.5f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    self.navigationController.viewControllers = [NSArray arrayWithObject:self.navigationController.viewControllers.lastObject];
});

这不是最干净的方法(dispatch_after),但您会看到它是如何完成的。确保 rootViewController 已hidesBackButton设置为YES.

于 2012-04-13T23:41:19.203 回答
0

是的,你当然可以这样做。

于 2012-04-14T19:45:36.360 回答
0

设置 rootViewController 是个好习惯

于 2012-04-14T01:26:04.693 回答