在學習多視圖控制器的時候,曾經有一個問題一直困擾著我,就是給標簽欄title賦值的問題。
就常用的層次關系來說,一個標簽欄視圖 裡面 套 一個 導航視圖 ,導航視圖 裡 套 我們展示內容 的 內容視圖 。
UITabBarController->UINavigationController->UIViewController
UITabBarController和UINavigationController 都繼承自UIViewController
UIViewControlleller 的tabBarItem
的詳情裡面最後一句話
The default value is a tab bar item that displays the view controller'€™s title.
標簽欄元素默認顯示的是 視圖控制器的標題。
navigationItem 裡面同樣有這麼一句話
The default behavior is to create a navigation item that displays the view controller'€™s title.
默認創建一個導航欄元素顯示 視圖控制器的標題
1.因此 activetyLC.title = @"活動"; 同時給導航欄和標簽欄賦值 就有跡可循了。
2. 若 我們的導航欄標題 和標簽欄 標題顯示的不一樣的時候如何賦值呢。
UIViewController是UINavigationController和 UITabBarController的父類
我們看下UIViewController裡面的navigationItem 和 tabBarItem 是如何說明的
The tab bar item that represents the view controller when added to a tab bar controller.
標簽欄元素 代表 控制器被 添加到的標簽欄控制器 的標簽欄元素 (父標簽欄 標簽元素)
The navigation item used to represent the view controller in a parent'€™s navigation bar. (read-only)
導航欄元素代表著 父視圖控制器的導航欄 元素 (父 導航欄 導航元素)
按照上面我所說的層次關系,在 最上層的 UIViewController
這樣寫:
self.navigationItem.title = @"活動";
self.tabBarItem.title = @"活動123"; 會如何??
結果是: 導航欄 標題 顯示 “活動” ,標簽欄為 “空”。
若我們給導航欄的 tabBarItem 賦值。
activetyNC.tabBarItem.title = @"活動";
則 標簽欄 正常顯示 “活動”。
結合上面的 UIViewController裡面對 導航元素和 標簽元素的 介紹。 這樣就明白了。
雖然
UINavigationController和 UITabBarController 都繼承自 UIViewController,他們中都有 標簽元素和導航元素屬性,但是
對 於:UIViewController navigationItem 和 tabBarItem 沒有賦值,則為空,若父視圖為導航欄控制器,navigationItem為 導航欄控制器的 navigationItem; 若父類為 標簽控制器,則 tabBarItem為 標簽控制器的 tabBarItem。
還有一點: 導航欄控制器,默認沒有 標簽欄的。 以前記錯了。下面有一張圖,會讓我們更清晰的了解這一點。
這張圖片不是說,導航欄後面默認有一個 標簽欄,而是說 導航欄 進一步 被嵌入到了一個 標簽欄裡面。粗心大意害死人啊。
In this figure, the navigation interface is further embedded inside a tab bar interface.