【问题标题】:TabBarController -> NavigationController -> Multiple UIViewController (rootview controllers) using StoryboardTabBarController -> NavigationController -> 使用 Storyboard 的多个 UIViewController(rootview 控制器)
【发布时间】:2013-12-22 07:13:28
【问题描述】:

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

- 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 我之前尝试过类似的代码,但问题是因为我使用的是故事板,所以我可以访问 tabBarController 的唯一方法是通过这个:

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

而且,当我尝试使用上面的代码时,我得到了一个错误 应用程序试图在目标上推送一个 nil 视图控制器

【问题讨论】:

  • 参考这个链接,可能对你有帮助stackoverflow.com/questions/14246454/…
  • 此链接与我的问题无关,因为当使用 prepareForSegue 方法单击按钮时,我可以轻松控制不同的视图。但是,就我而言,没有按钮。只是根视图在应用启动时发生变化

标签: ios iphone objective-c xcode tabbarcontroller


【解决方案1】:

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

编辑
假设您已在 AppDelegate 中初始化了 tabBarController 属性、registrationViewController 属性和返回 BOOLisRegistered 方法,
将下一个代码放入您的 application:didFinishLaunchingWithOptions: 方法中(就在 return YES; 之前):

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

【讨论】:

  • 我理解您的观点,即标签栏不知道注册控制器是导航控制器的一部分。但是,在我的情况下,TabBar 知道 NavigatonController 并且 RegistrationController 是独立视图。所以,如果你可以发布一些代码来帮助我将 RegistrationController 作为 NavigationController 的一部分,我应该能够在运行时获得机会,因为根据上面突出显示的结构,我有 Registration 和 DoActivityPage 可能希望成为 NavigationController 的根视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多