后来换成通过代码创建。也是同样的问题。切换tab,viewcontroller不出来。郁闷到极点。后来搜索到一篇文章,说UITabBarController一般添加到appDelegate的。想想会不会真的只能添加到appDelegate而不能添加到viewcontroller里面呢?测试了一下,将代码移到appDelegate中。运行,shit,不禁倒抽一口气。果然是在appDelegate里面完全正常。切换tab如行云流水。真搞不懂,为啥就不能像其他viewcontroller那样添加到其他viewcontroller中呢?还是自己没有掌握方法?粗略看了一下帮助文档,好像也没提到只能添加到appDelegate中。不知是不是看得太粗略了没看清楚。怎么都好,暂时解决了这个问题。希望以后不断深入后可以得到答案。
另外总结一点:
UITabBarController中viewControllers如果添加了相同的viewcontroller,则不会增加tabitem的数量。这个在测试的时候发现。当时将viewcontrollers指定为三个一样的viewcontroller(想省事,少敲代码),结果出来的tabbar只有一个tab。换了另外两个不同的viewcontroller,问题就解决了。呵呵。
【重大更新】
就在写完这篇文章不到10分钟的时间,偶尔间有了一个大发现。上面说到的UITbaBarController只能用在appDelegate的说法是错误的。因为是完全可以在viewcontroller中使用的。之前的代码之所以出现错误,误导了自己半天,原因就是创建UITabBarController后,将它的位置重新设置了,而设置了错误的大小而导致切换tab时无法出现viewcontroller。设置的代码是这样的:[tabBarController .view setFrame:CGRectMake(0, self.view.frame.size.height - 49, self.view.frame.size.width, 49)];之所以是这样设置,是因为开始的时候没有了解tabbarcontroller,将它当做仅仅是一个tabbar来使用,将高度设置为49,y坐标设置为底端往上49像素。一个愚蠢的做法以及对控件的完全不了解导致了半天的瞎搞。由此警醒自己,即便再紧张的项目,也要先了解控件的使用。俗话说,磨刀不误砍柴工。胡乱的写代码还不如先静下心看懂了控件怎么用之后再去动手。经过这一次的教训,务必切记切记,这样才不枉半天的劳动力啊。
转帖一段学习笔记:
UITabBarController学习笔记
一. 基本知识
和UINavigationController类似,UITabBarController也可以用来控制多个页面导航,用户可以在多个视图控制器之间移动,并可以定制屏幕底部的选项卡栏。
借助屏幕底部的选项卡 栏,UITabBarController不必像UINavigationController那样以栈的方式推入和推出视图,而是组建一系列的控制器 (他们各自可以是UIViewController,UINavigationController,UITableViewController或任何 其他种类的视图控制器),并将它们添加到选项卡栏,使每个选项卡对应一个视图控制器。
二. 具体介绍
1. 通过代码的方式创建UITabBarController界面
代码的位置应该放在xxxAppDelegate.m中 的applicationDidFinishLaunching:方法中,因为Tab Bar Controller通常是为应用窗口提供根视图,所以需要在程序启动后,窗口显示前创建Tab Bar Controller。具体创建步骤为:
(1) 创建一个新的UITabBarController对象
(2) 为每一个Tab创建一个root view controller
(3) 把这些root view controllers添加到一个array中,再把这个array分配给tab bar controller的viewControllers属性
(4) 把tab bar controller's view添加到应用程序主窗口
例子:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tabBarController = [[UITabBarController alloc] init];
MyViewController* vc1 = [[MyViewController alloc] init];
MyOtherViewController* vc2 = [[MyOtherViewController alloc] init];
NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, nil];
tabBarController.viewControllers = controllers;
// Add the tab bar controller's current view as a subview of the window
[window addSubview:tabBarController.view];
}
2. 通过代码的方式创建TabBarItem
Tab Bar Controller的每个选项卡都得有一个UITabBarItem,可以在其root view controller初始化时创建并添加UITabBarItem。
例子:
- (id)init {
if (self = [super initWithNibName:@"MyViewController" bundle:nil]) {
self.title = @"My View Controller";
UIImage* anImage = [UIImage imageNamed:@"MyViewControllerImage.png"];
UITabBarItem* theItem = [[UITabBarItem alloc] initWithTitle:@"Home" image:anImage tag:0];
self.tabBarItem = theItem;
[theItem release];
}
return self;
}