假如從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的推理,留給大家自己去思考吧。留點空間給大家。吼吼~~