正確理解Navgation的BackItem

來源:互聯網
上載者:User

假如從A視圖控制器進入B視圖控制器(self指的是AController,BController指的B)

UINavigationController Class Reference發現使用pushViewController切換到下一個視圖時,navigation controller按照以下3條順序更改導覽列的左側按鈕。
1、如果B視圖有一個自訂的左側按鈕(leftBarButtonItem),則會顯示這個自訂按鈕,矩形非尖角的;
2、如果B沒有自訂按鈕,但是A視圖的backBarButtonItem屬性有自訂項,則顯示這個自訂項,樣式是尖角的
3、如果前2條都沒有,則預設顯示一個後退按鈕,後退按鈕的標題是A視圖的標題。這個按鈕的樣式是尖角的。

按照這個解釋,如果要達到修改backItem的目的,則修改的代碼應該放在A視圖的pushViewController語句之前。

UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:nil action:nil];[self.navigationItem setBackBarButtonItem:backItem];//修改的是A的navigationItem[backItem release];[self.navigationController pushViewController:BController animated:YES];//一定要在push之前修改哦。

還有一個問題也在這裡說出來探討一下吧. 大家有沒有留意過一個現象,就是我們使用或者修改navgationbar的時候,是self.navigationController.navigationBar,而修改item的時候使用的是self.navigationItem。

這個現象說明一個什麼問題呢?

就是,navgationcontroller在一個層次視圖管理結構中是唯一的,它負責管理了視圖的棧。也就是說,所有使用self.navigationController的屬性,比如self.navigationController.navigationBar,這種修改或者使用對於整個視圖棧都是具有全域性的,再具體一點到一個控制項上,就是說navigationbar是唯一的。
相似的理解,那麼使用self.navigationItem的地方就意味著修改的是self的一個屬性,也就意味著navigationItem只是當前視圖的一個屬性而已。那麼,也就意味著每一個視圖都有著自己獨立的navigationItem。通過在xcode4.4,列印日誌驗證,也確實如此。只是不知道是否所有版本是統一的。

日誌如下:

 main:<UINavigationItem: 0x6b912b0>
 main:<UINavigationController: 0x6b82630>
 main:<UINavigationBar: 0x6b90620; frame = (0 20; 320 44); autoresize = W; layer = <CALayer: 0x6b90710>>
 second:<UINavigationItem: 0xde6f470>
 second:<UINavigationController: 0x6b82630>
 second:<UINavigationBar: 0x6b90620; frame = (0 20; 320 44); autoresize = W; layer = <CALayer: 0x6b90710>>

點擊返回之後再次跳轉到second,又會隨著新的controller的產生而產生新的navigationItem。
 second:<UINavigationItem: 0x6b92dd0>
 second:<UINavigationController: 0x6b82630>
 second:<UINavigationBar: 0x6b90620; frame = (0 20; 320 44); autoresize = W; layer = <CALayer: 0x6b90710>>

navigationitem是繼承自NSObect,充當的是一個容器的作用,可以用來在navgationbar顯示標題,左右按鈕等等。

剩下的還有一些關於buttonItem的推理,留給大家自己去思考吧。留點空間給大家。吼吼~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.