TabBarController - > NavigationController - >使用Storyboard的多个UIViewController(rootview控制器)

时间:2013-12-22 07:13:29

标签: ios iphone objective-c xcode tabbarcontroller

我正在使用具有以下结构的storyboard开发应用程序:

- TabBarController (2 Tab Bars) - Initial View Controller
    o NavigationController1
       • RegistrationPage - UIViewController (candidate for rootview)
       • DoActivityPage - UIViewController (candidate for rootview)

    o NavigationController2
       • View Controller 1

首次启动应用程序时,我想向用户显示RegistrationPage,并在随后的时间向用户显示DoActivityPage。由于这两个页面都处于同一级别,因此每个页面都可能成为根视图控制器。

我正在使用Storyboard布局,所以在视觉上我只能将其中一个视图作为rootViewController,这不符合我的目的。所以,我知道我必须以编程方式实现这一目标,并且我已经在Google上尝试了很多但是无法找到方法。

我的问题是,如何以编程方式为导航控制器设置根视图控制器(多个根视图控制器),请记住我正在使用故事板?

目前,当应用程序启动时,我会看到一个黑色页面,并选择了第一个标签项。如果我在AppDelegate.m中添加以下代码,我会看到页面,但是空底部和顶部栏:

UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
RegistrationPage *rp = [navController.storyboard instantiateViewControllerWithIdentifier:@"RegistrationPage"];
navController.viewControllers = [NSArray arrayWithObjects: rp, nil];

@Michael之前我曾经尝试过类似的代码,但问题是因为我使用的是storyboard,我可以访问tabBarController的唯一方法是:

self.window.rootViewController.tabBarController
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:self.window.rootViewController.tabBarController];

而且,当我尝试使用上面的代码时,我收到一个错误     应用程序试图在目标

上推送一个nil视图控制器

1 个答案:

答案 0 :(得分:1)

通常注册/登录视图控制器没有集成在标签栏内 它是一个完全独立的视图控制器(可能包含在自己的导航控制器中) 应用程序启动后,您应该检查代码是否应该打开注册/登录并将其作为模态视图控制器打开。

修改
假设您已初始化tabBarController属性,registrationViewController属性和isRegistered方法,在BOOL中返回AppDelegate, 将下一个代码放在application:didFinishLaunchingWithOptions:方法中(return YES;之前):

if ([self isRegistered] == NO) {
    UINavigationController *navController = [[UINavigationController alloc]
                                             initWithRootViewController:self.tabBarController];
    [self.tabBarController presentViewController:navController
                                        animated:NO
                                      completion:NULL];
}
  • 可能有更好的地方放置此代码,但这是最简单的解释,假设我不知道您的项目中有哪些类。