導(dǎo)航控制器詳細(xì)分析

Snip20170712_3.png

導(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)航控制器一起使用酱固。

UINavigationBar.png

再來看看 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),如下,

困惑1.png

貌似 navigationController 也有 navigationItem 屬性,這是怎么回事呢?

事實(shí)上,UINavigationController 并沒有 navigationItem 這個屬性,但是 navigationController 繼承于 viewController ,而 viewController 擁有 navigationItem 屬性,但是如果你這樣用,

self.navigationController.navigationItem.title = @"籃球";

是沒有效果的,這是因?yàn)?UINavigationController 是一個 特殊的 視圖控制器,他是視圖控制器的容器,(類似的還有 UITabBarController 和 UISplitViewController ),不能把它當(dāng)做一般的 viewControlelr 使用,

但是,還有一個令人困惑的地方在于

self.navigationItem.title = @"籃球火";

困惑.png

同樣是對導(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嗤瞎。

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市听系,隨后出現(xiàn)的幾起案子贝奇,更是在濱河造成了極大的恐慌,老刑警劉巖靠胜,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉瞳,死亡現(xiàn)場離奇詭異毕源,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陕习,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門霎褐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人该镣,你說我怎么就攤上這事冻璃。” “怎么了损合?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵省艳,是天一觀的道長。 經(jīng)常有香客問我嫁审,道長跋炕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任律适,我火速辦了婚禮辐烂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捂贿。我一直安慰自己纠修,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布眷蜓。 她就那樣靜靜地躺著,像睡著了一般胎围。 火紅的嫁衣襯著肌膚如雪吁系。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天白魂,我揣著相機(jī)與錄音汽纤,去河邊找鬼。 笑死福荸,一個胖子當(dāng)著我的面吹牛蕴坪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敬锐,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼背传,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了台夺?” 一聲冷哼從身側(cè)響起径玖,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颤介,沒想到半個月后梳星,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赞赖,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年冤灾,在試婚紗的時候發(fā)現(xiàn)自己被綠了前域。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡韵吨,死狀恐怖匿垄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情学赛,我是刑警寧澤年堆,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站盏浇,受9級特大地震影響变丧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绢掰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一痒蓬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滴劲,春花似錦攻晒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萧芙,卻和暖如春给梅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背双揪。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工动羽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渔期。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓运吓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疯趟。 傳聞我的和親對象是個殘疾皇子拘哨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容