iOS:有条件地加载视图控制器

时间:2012-04-13 23:31:58

标签: iphone objective-c ios cocoa-touch

有没有办法从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 个答案:

答案 0 :(得分:1)

是的,这很方便,你没有限制。

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

self.window.rootViewController = nav;//or su;

答案 1 :(得分: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

答案 2 :(得分:0)

设置rootViewController是个好习惯

答案 3 :(得分:0)

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