一、什么是標(biāo)簽欄控制器?把標(biāo)簽欄控制器(UITabBarController)、標(biāo)簽欄(UITabBar)、導(dǎo)航欄控制器(UINavigationController)、導(dǎo)航欄(UINavigationBar)分清楚。
UITabBarController是繼承與UIViewController的,它也是試圖控制器,叫標(biāo)簽欄試圖控制器,UIViewController是繼承與UIResponder的,UIresponder是繼承于NSObject的。
UITabBarController(標(biāo)簽欄控制器)和UINavigationController(導(dǎo)航欄控制器)一樣是用來(lái)管理視圖控制器的,但UINavigationController是用來(lái)管理視圖控制器之間的導(dǎo)航(此處似乎有些許籠統(tǒng),具體什么是導(dǎo)航,需要多使用幾次標(biāo)簽欄控制器和導(dǎo)航欄控制器,自然明白了),UITabBarController是用來(lái)管理固定的幾個(gè)視圖控制器,這幾個(gè)被管理的視圖控制器是并列的,可以任意切換顯示。
很多常見的應(yīng)用程序都用UITabBarController來(lái)做整體的布局,如下圖所示:

在此圖中程序框架就是從tabBarController上開始,tabBarController有個(gè)屬性是viewControllers,是NSArry類型的,這一點(diǎn)和navigationController是一樣的,因此一個(gè)標(biāo)簽欄控制器(UITabBarController)可以對(duì)應(yīng)多個(gè)視圖控制器(UIViewController)。
由于導(dǎo)航欄控制器是繼承于視圖控制器,所以一個(gè)標(biāo)簽欄控制器也就可以對(duì)應(yīng)多個(gè)導(dǎo)航欄控制器。
再往下一個(gè)導(dǎo)航欄控制器又可以對(duì)用多個(gè)視圖控制器,但必須對(duì)應(yīng)一個(gè)根視圖控制器。補(bǔ)充說(shuō)明:在storyBoard里面,一個(gè)導(dǎo)航控制器連線一個(gè)根試圖控制器,其他的子視圖控制器是通過(guò)push進(jìn)去的,不連線。
說(shuō)了這么多,到底什么是標(biāo)簽欄控制器呢?標(biāo)簽欄控制器(UITabBarController)就是帶有標(biāo)簽欄(UITabBar)的控制器,標(biāo)簽欄(UITabBar)是標(biāo)簽欄控制器的屬性,它是標(biāo)簽欄控制器上的一個(gè)組成部分,就像導(dǎo)航欄控制器(UINavigationController)一樣,導(dǎo)航欄控制器帶有一個(gè)導(dǎo)航欄(UINavigationBar)。在存在導(dǎo)航欄控制器的情況下顯示在模擬器最上面的一欄就是導(dǎo)航欄,那標(biāo)簽欄控制器(UITabBarController)的標(biāo)簽欄(UITabBarItem)在哪里呢,存在標(biāo)簽欄控制器的時(shí)候顯示在模擬器上就是最下面的一欄。


標(biāo)簽欄和導(dǎo)航欄分別是標(biāo)簽欄控制器和導(dǎo)航欄控制器的一部分。
那在上標(biāo)簽欄的圖里面,下面的五個(gè)button是什么呢?它們就是標(biāo)簽欄(UITabBar)的標(biāo)簽項(xiàng)items(UITabBarItem)。就如導(dǎo)航欄控制器(UINavigationController)上有一個(gè)導(dǎo)航欄(UINavigationBar),導(dǎo)航欄上又有一個(gè)導(dǎo)航項(xiàng)(UINavigationItem)一樣。
注意:TabBar只能最多顯示五個(gè)tabBarItem。如果超過(guò)5個(gè)則會(huì)自動(dòng)生成個(gè)More的標(biāo)簽顯示剩余的TabBarItem, 這些TabBarItem可以通過(guò)編輯顯示在UITabBar上。

二、TabBarController的結(jié)構(gòu)
Tab控制器是用數(shù)組管理子視圖控制器,并且子視圖之間是 平等關(guān)系。導(dǎo)航控制器所管理的視圖控制器之間的上下級(jí)關(guān)系。

就像UINavigationBar一樣,UITabBar是繼承于UIView的,它的結(jié)構(gòu)如下圖:

補(bǔ)充說(shuō)明:UITabBarItem又是什么呢?它是誰(shuí)的屬性?
UITabBarItem是試圖控制器viewController的屬性,而不是標(biāo)簽欄控制器(UITabBarController)或標(biāo)簽欄(UITabBarItem)的屬性,它是繼承于UIBarItem的,UIBarItem又繼承與NSObject。
UINavigationItem是直接繼承于NSObject的,而UITabBarItem是繼承于UIBarItem,UIBarItem繼承于NSObject。UINavigationItem和UITabBarItem都是試圖控制器viewController的屬性,而不是導(dǎo)航欄控制器和標(biāo)簽欄控制器的屬性。
三、UITabBarController代理
常用代理方法:
//視圖將要切換時(shí)調(diào)用,viewController是將要顯示的控制器。
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController { }
//視圖已經(jīng)切換后調(diào)用,viewController是已經(jīng)顯示的控制器。
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { }