UITabBarController的使用
UITabBarController 是IOS中很常用的一个视图控件,它通常作为整个程序的根视图控制器,不能添加到别的viewController中。
UITabBarController的结构示意图如下:
1.手动创建TabController:
通过在AppDelegate类当中的application:didFinishedLaunchingWithOptions:方法中添加代码:
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *con1,*con2;//自己创建的ViewController类,包含一个nib文件
con1=[[ViewController alloc]init];
con1.title=@”first”;//这个标题将显示在tabItem按钮里面
con2=[[ViewController alloc]init];
con2.title=@”second”;
tabBarController=[[UITabBarViewController alloc]init];
self.tabBarController.viewControllers=[NSArray arrayForObjects:con1,con2,nil];
self.window.rootViewController=tabBarController;//设置为根控制器
[self.window makeKeyAndVisible];
2.UITabBarItem
UITabBarItem *item1=[[UITabBarItem alloc]initWithTitle:@”first” image:nil tag:1];
//创建一个UITabBarItem对象
[item1 setFinishedSelectedImage:[UIImage imageNamed:@”pic1.png”] withFinishedUnselectedImage:[UIImage imageNamed:@”pic2.png”];//设定item的图片
con1.tabBarItem=item1//赋值给controller的tabBarItem属性。
效果如下图,图片比较大不好意思。
3.more Navigation Controller
当UITabItem超过5个的时候,就会出现一个more标签,引导你进入一个more导航控制器,里面存放值多出来的tabItem。点击任意一个就会进入响应的tabItem
点击edit会进入一个编辑界面:
进入这个界面后我们可以通过拖拽改变标签的顺序,如果不想使用此功能,就将customizableViewController属性设置为nil来屏蔽此功能。
通过编辑customizableViewController属性,可以实现复杂的带条件的画面显示制定顺序。
假如设置1~7个标签,将前三个固定下来,但是第四个以上就可以调换顺序,
tabBarViewController.customizableViewControllers =[NSArray arrayWithObjects:con4,con5,con6,nil];
我们可以通过设置UITabBarController的customizableViewControllers属性来指定viewControllers的一个子集,允许一部分的viewController是可以放到tabBar中显示的。
当viewControllers的属性发生变化的时候,customizableViewControllers就会自动设置成和viewControllers一致,因此在设置完viewControllers后,重新设置一遍customizableViewControllers属性。
4.UITabBarController的旋转
当且仅当所有的viewContrller都支持旋转的时候,tabBarController才回支持旋转。但是只有当前显示的viewController才会接收到旋转消息。
5.UITabBar
UITabBar有一些方法可以改变自身的状态,但是对于UITabBarController自带的tabBar,直接修改状态会抛出异常。*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Directly modifying a tab bar managed by a tab bar controller is not allowed.
6.改变选中的控制器
改变显示的控制器,可以使用
1.selectIndex属性
通过该属性可以获得当前选中的viewController,设置该属性,可以显示对应的视图控制器。当显示的式more导航控制器中的视图是,返回值是NSNotFound。设置超出ViewController的范围就会被忽略。
2.selectedViewController属性
通过该属性可以获取到当前显示的viewController,通过该属性可以设置当前选中的视图控制器。tabBarController.moreNavigationController可以选中moreViewController。
3.viewController属性
设置viewControllers属性也会影响当前选中的viewController,设置该属性时UITabBarController首先会清空所有旧的viewController,然后部署新的viewController,接着尝试重新选中上一次显示的viewController,如果该viewController已经不存在的话,会接着尝试选中index和selectedIndex相同的viewController,如果该index无效的话,则默认选中第一个viewController。
7.事件监听
我们可以通过UITabBarControllerDelegate监听UITabBarController的选中的viewController的变化,以及moreViewController中对所有viewController的编辑。这里需要注意的是delegate方法要放在AppDelegate.h头文件里面。而且tabController.delegate要设置为self才会调用设置的方法。
- (BOOL)tabBarController:(UITabBarController *)tabBarController1 shouldSelectViewController:(UIViewController *)viewController
{
if ([tabBarController1.viewControllersindexOfObject:viewController] != 1) {
returnYES;
}
returnNO;
}
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers
{
[selfshowAlert:@"willBeginCustom"];
}
当点击edit是弹出对话框。
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{
[selfshowAlert:@"willEndCustom"];
}
当点击done的时候先弹出对话框
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{
[selfshowAlert:@"didEndCustom"];
}
紧接着弹出对话框