UITabBarController的使用

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"];

}

紧接着弹出对话框

 

posted @ 2014-01-11 18:38  湖心北斗  阅读(2994)  评论(0编辑  收藏  举报