一、什麼是標簽欄控制器?把標簽欄控制器(UITabBarController)、標簽欄(UITabBar)、導航欄控制器(UINavigationController)、導航欄(UINavigationBar)分清楚。
UITabBarController是繼承與UIViewController的,它也是試圖控制器,叫標簽欄試圖控制器,UIViewController是繼承與UIResponder的,UIresponder是繼承於NSObject的。
UITabBarController(標簽欄控制器)和UINavigationController(導航欄控制器)一樣是用來管理視圖控制器的,但UINavigationController是用來管理視圖控制器之間的導航(此處似乎有些許籠統,具體什麼是導航,需要多使用幾次標簽欄控制器和導航欄控制器,自然明白了),UITabBarController是用來管理固定的幾個視圖控制器,這幾個被管理的視圖控制器是並列的,可以任意切換顯示。
很多常見的應用程序都用UITabBarController來做整體的布局,如下圖所示:
在此圖中程序框架就是從tabBarController上開始,tabBarController有個屬性是viewControllers,是NSArry類型的,這一點和navigationController是一樣的,因此一個標簽欄控制器(UITabBarController)可以對應多個視圖控制器(UIViewController)。
由於導航欄控制器是繼承於視圖控制器,所以一個標簽欄控制器也就可以對應多個導航欄控制器。
再往下一個導航欄控制器又可以對用多個視圖控制器,但必須對應一個根視圖控制器。補充說明:在storyBoard裡面,一個導航控制器連線一個根試圖控制器,其他的子視圖控制器是通過push進去的,不連線。
說了這麼多,到底什麼是標簽欄控制器呢?標簽欄控制器(UITabBarController)就是帶有標簽欄(UITabBar)的控制器,標簽欄(UITabBar)是標簽欄控制器的屬性,它是標簽欄控制器上的一個組成部分,就像導航欄控制器(UINavigationController)一樣,導航欄控制器帶有一個導航欄(UINavigationBar)。在存在導航欄控制器的情況下顯示在模擬器最上面的一欄就是導航欄,那標簽欄控制器(UITabBarController)的標簽欄(UITabBarItem)在哪裡呢,存在標簽欄控制器的時候顯示在模擬器上就是最下面的一欄。
標簽欄如圖:導航欄如圖:
標簽欄和導航欄分別是標簽欄控制器和導航欄控制器的一部分。
那在上標簽欄的圖裡面,下面的五個button是什麼呢?它們就是標簽欄(UITabBar)的標簽項items(UITabBarItem)。就如導航欄控制器(UINavigationController)上有一個導航欄(UINavigationBar),導航欄上又有一個導航項(UINavigationItem)一樣。
注意:TabBar只能最多顯示五個tabBarItem。如果超過5個則會自動生成個More的標簽顯示剩余的TabBarItem, 這些TabBarItem可以通過編輯顯示在UITabBar上。
二、TabBarController的結構
Tab控制器是用數組管理子視圖控制器,並且子視圖之間是 平等關系。導航控制器所管理的視圖控制器之間的上下級關系。
就像UINavigationBar一樣,UITabBar是繼承於UIView的,它的結構如下圖: