導(dǎo)航控制器幾乎是我們開發(fā)中接觸的最多的了,但是很多時候很多人還是總會把其中的 navigationBar , navigationItem 和 bar button item 等混淆,今天我們就來總結(jié)一下.
1, UINavigationBar 和 UINavigationItem
UINavigationBar:
先看看開發(fā)文檔對其的描述:
原文
The UINavigationBar class provides a control for navigating hierarchical content. It’s a bar, typically displayed at the top of the screen, containing buttons for navigating within a hierarchy of screens.The primary properties are a left (back) button, a center title, and an optional right button. You can use a navigation bar as a standalone object or in conjunction with a navigation controller object.
翻譯
UINavigationBar類提供一種對導(dǎo)航層級內(nèi)容的控制典唇。它是一個欄鲁冯,最典型的用法就是放在屏幕頂端,包含著各級視圖的導(dǎo)航按鈕延届。它最首要的屬性是左按鈕(返回按鈕)、中心標(biāo)題贸诚,還有可選的右按鈕方庭。你可以單獨(dú)用導(dǎo)航欄,或者和導(dǎo)航控制器一起使用酱固。
再來看看 UINavigationItem
原文
A UINavigationItem object manages the buttons and views to be displayed in a UINavigationBar object. When building a navigation interface, each view controller pushed onto the navigation stack must have a UINavigationItem object that contains the buttons and views it wants displayed in the navigation bar. The managing UINavigationController object uses the navigation items of the topmost two view controllers to populate the navigation bar with content.
翻譯
一個UINavigationItem對象管理展示在導(dǎo)航欄上的按鈕和視圖械念。當(dāng)創(chuàng)建一個導(dǎo)航界面的時候,每個壓入導(dǎo)航棧中的視圖控制器都需要一個navigation item,它包含了展示在導(dǎo)航欄上的按鈕和視圖运悲。導(dǎo)航控制器利用最頂層的兩個視圖控制器的navigation item來提供導(dǎo)航欄的內(nèi)容龄减。
實(shí)際上 navigationItem 是 navigationBar 的屬性,navigationBar 可以說是一個容器, navigationItem 是布局在其內(nèi)的,但是我們用純代碼的時候會發(fā)現(xiàn),如下,
貌似 navigationController 也有 navigationItem 屬性,這是怎么回事呢?
事實(shí)上,UINavigationController 并沒有 navigationItem 這個屬性,但是 navigationController 繼承于 viewController ,而 viewController 擁有 navigationItem 屬性,但是如果你這樣用,
self.navigationController.navigationItem.title = @"籃球";
是沒有效果的,這是因?yàn)?UINavigationController 是一個 特殊的 視圖控制器,他是視圖控制器的容器,(類似的還有 UITabBarController 和 UISplitViewController ),不能把它當(dāng)做一般的 viewControlelr 使用,
但是,還有一個令人困惑的地方在于
self.navigationItem.title = @"籃球火";
同樣是對導(dǎo)航欄的操作,為什么一個在第一層級(UIViewController) ,另一個在其屬性navigationController的層級,
如前所述, navigationItem 是 UIViewController 的一個屬性,開發(fā)者文檔是這樣描述的
This is a unique instance of UINavigationItem created to represent the view controller when it is pushed onto a navigation controller. The first time the property is accessed, the UINavigationItem object is created. Therefore, you should not access this property if you are not using a navigation controller to display the view controller. To ensure the navigation item is configured, you can either override this property and add code to create the bar button items when first accessed or create the items in your view controller'€?s initialization code.
Avoid tying the creation of bar button items in your navigation item to the creation of your view controller'€?s view. The navigation item of a view controller may be retrieved independently of the view controller'€?s view. For example, when pushing two view controllers onto a navigation stack, the topmost view controller becomes visible, but the other view controller'€?s navigation item may be retrieved in order to present its back button.
The default behavior is to create a navigation item that displays the view controller'€?s title.
翻譯
它是UINavigationItem一個獨(dú)特的實(shí)例。當(dāng)視圖控制器被推倒導(dǎo)航控制器中時班眯,它來代表這個視圖控制器希停。當(dāng)?shù)谝淮卧L問這個屬性的時候,它會被創(chuàng)建署隘。因此宠能,如果你并沒有用導(dǎo)航控制器來管理視圖控制器,那你不應(yīng)該訪問這個屬性磁餐。為確保navigation item 已經(jīng)配置违崇,你可以在視圖控制器初始化時,重寫這個屬性、創(chuàng)建bar button item亦歉。
要避免在創(chuàng)建視圖控制器的視圖時恤浪,創(chuàng)建bar button item。視圖控制器的這個屬性——navigationItem,它的恢復(fù)(生命周期——作者注)肴楷,可能獨(dú)立于視圖控制器的視圖水由。為什么會這樣?舉例來說赛蔫,當(dāng)把兩個視圖控制器壓到導(dǎo)航棧中砂客,最頂層的視圖控制器是可見的,但另一個視圖控制器的navigation item 可能是活躍狀態(tài)(此時呵恢,隱藏的視圖控制器的視圖肯定是不活躍的鞠值,所以,這個時候navigation item 是獨(dú)立于視圖控制器的視圖的——作者注)渗钉,因?yàn)樗尸F(xiàn)其返回按鈕彤恶。
默認(rèn)行為是創(chuàng)建一個navigation item 來展示視圖控制器的標(biāo)題。
總結(jié)一下鳄橘,如果把導(dǎo)航控制器(navigationController)比作一個劇院声离,那導(dǎo)航欄(navigationBar)就相當(dāng)于舞臺,舞臺必然是屬于劇院的瘫怜,所以术徊,導(dǎo)航欄是導(dǎo)航控制器的一個屬性。視圖控制器(UIViewController)就相當(dāng)于一個個劇團(tuán)鲸湃,而導(dǎo)航項(xiàng)(navigationItem)就相當(dāng)于每個劇團(tuán)的負(fù)責(zé)人赠涮,負(fù)責(zé)與劇院的人接洽溝通。顯然暗挑,導(dǎo)航項(xiàng)應(yīng)該是視圖控制器的一個屬性笋除。雖然導(dǎo)航欄和導(dǎo)航項(xiàng)都在做與導(dǎo)航相關(guān)的事情,但是它們的從屬是不同的炸裆。也就是說 導(dǎo)航欄 從屬于 導(dǎo)航控制器, 導(dǎo)航項(xiàng) 從屬于 視圖控制器
導(dǎo)航欄(navigationBar)相當(dāng)于負(fù)責(zé)劇院舞臺的布景配置株憾,導(dǎo)航項(xiàng)(navigationItem)則相當(dāng)于協(xié)調(diào)每個在舞臺上表演的演員(bar button item,title 等等),每個視圖控制器的導(dǎo)航項(xiàng)可能都是不同的晒衩,可能一個右邊有一個選擇照片的bar button item,而另一個視圖控制器的右邊有兩個bar button item嗤瞎。