如何将 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