如何将 tabBarController 设置为 rootViewController

Posted

技术标签:

【中文标题】如何将 tabBarController 设置为 rootViewController【英文标题】:How to set a tabBarController as rootViewController 【发布时间】:2016-09-03 10:26:15 【问题描述】:

在 AppDelegate 中,我想将 TabBarController 设置为 rootViewController。

我试过了:

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

我也试过了:

UITabBarController *tabBarController = [[UITabBarController alloc] init];
self.window.rootViewController = tabBarController;

但它说:

无法实例化默认视图控制器 UIMainStoryboardFile 'Main' - 也许指定的入口点是 没有设置?

我在 AppDelegate 中的完整代码:

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

    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;

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

    // Movies
    MediaListViewController *moviesVC = (MediaListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MediaList"];
    moviesVC.title = @"Movies";
    moviesVC.tabBarItem.image = [[UIImage imageNamed:@"superman"] imageWithRenderingMode:(UIImageRenderingModeAlwaysTemplate)];
    UINavigationController *moviesNC = [[UINavigationController alloc] initWithRootViewController:moviesVC];
    moviesNC.navigationBar.barTintColor = [[UIColor blackColor]colorWithAlphaComponent:0.5];
    moviesNC.navigationBar.tintColor = [UIColor yellowColor];
    moviesNC.navigationBar.barStyle = UIBarStyleBlack;

    //DVDs
    MediaListViewController *dvdsVC = (MediaListViewController *)[storyboard instantiateViewControllerWithIdentifier:@"MediaList"];
    dvdsVC.title = @"DVDs";
    dvdsVC.tabBarItem.image = [[UIImage imageNamed:@"hulk"] imageWithRenderingMode:(UIImageRenderingModeAlwaysTemplate)];
    UINavigationController *dvdsNC = [[UINavigationController alloc] initWithRootViewController:dvdsVC];
    dvdsNC.navigationBar.barTintColor = [[UIColor blackColor]colorWithAlphaComponent:0.5];
    dvdsNC.navigationBar.tintColor = [UIColor yellowColor];
    dvdsNC.navigationBar.barStyle = UIBarStyleBlack;

    tabBarController.viewControllers = @[moviesNC, dvdsNC];
    tabBarController.tabBar.barTintColor = [[UIColor blackColor]colorWithAlphaComponent:0.5];
    [self.window makeKeyAndVisible];

    return YES;

【问题讨论】:

第二次尝试时发生了什么? UITabBarController *tabBarController = [[UITabBarController alloc] init]; 嗨@AnilVarghese,它也说和第一个一样。 在您的 main.storyboard 中,您是否将第一个控制器(可能是标签栏控制器)设置为 initialViewController 感谢@AnilVarghese,它解决了我的问题。 【参考方案1】:

info.plist 中有一个键,它指定需要在您的应用程序中使用的主故事板文件。

因此,每当您的应用加载时,ios 都会检查此键并尝试使用与此键的值匹配的名称来初始化情节提要。为了初始化故事板,应该设置一个入口点(初始视图控制器)。即使您通过代码设置选项卡控制器,iOS 系统也会尝试初始化情节提要并抛出该消息。

因此,要解决此问题,有两种选择:

    只需在您的故事板文件中设置一个初始视图控制器(一个虚拟入口点),在应用程序委托中您可以覆盖它(我推荐这种方法) 继续从info.plist 中删除UIMainStoryboardFile aka Main storyboard file base name 键(此方法简单且有效,但除非您设置入口点,否则您永远无法初始化情节提要。因此,如果您选择此选项你不能永远在你的设计中使用故事板,你只能使用 xib 或通过代码来设计你的 UI)

【讨论】:

以上是关于如何将 tabBarController 设置为 rootViewController的主要内容,如果未能解决你的问题,请参考以下文章

无法将“UINavigationController”类型的值转换为 tabBarController

TabBarController 和 NavigationController

我应该如何从 TabBarController 呈现模态视图控制器

如何以编程方式将自定义图像设置为 UIBarButtonItem

如何将“更多”标签栏的编辑视图的导航栏设置为黑色?

Objective-C:如何正确设置 TabBarController 的 didSelectViewController 方法,这样我每次点击时都可以刷新 VC