UINavigationController 層次關系


參考:
http://www.cnblogs.com/ygm900/p/3659619.html
 

1、 UINavigationController 是一個容器類。里面盛放的是UIViewController。

容器的意思是,如果你不放入UIViewController,里面就是空的,什么也沒有。

這個容器在管理UIViewController時,遵循棧管理的原則(后進先出)。

2、UINavigationController雖然是個容器,但也不是干巴巴的空殼。它由以下四部分組成:Navigation toolbar、Custom content、Navigation bar、,Navigation view。其中,我猜測,入棧的UIViewController 其界面應該就展示在Custom content區域。

概述:

UINavigationController:是一個ViewController,導航欄控制器,其通過棧來直接控制了其下的viewController。可通過此設置全局導航欄屬性。如導航欄背景或title顏色等。子視圖會繼承這些屬性,具體見下面“初始化UINavigationController”

UINavigationBar:是一個View,NavigaitonBar就是導航欄,位於屏幕的上方,管理整個NavigationController的navigationItem,即類似navigationController一樣提供了一個棧來管理item。

UINavigationItem:是一個NSObject,一般使用在self.navigationItem, 包含了當前頁面導航欄上需要顯示的全部信息(
title,prompt,titleView,leftBarButtonItem,rightBarButtonItem,backBarButonItem )。其中UIBarButtonItem是一個UIBarItem,是一種專門放在UINavigationBar上的特殊button。
 
UINavigation toolbar: 是tool條,包括image,文字title

簡單講

全局唯一的UINavigationController棧生成全局唯一的UINavigationBar棧,UINavigationController中的每個UIViewController管理UINavigationBar(UINavigationController棧每個UIViewController將自身的屬性:navigationItem壓入或彈出UINavigationBar)。

 

兩個棧——UINavigationControllerUINavigationBar,從層次關系上來說,是一一對應的:

上方注釋的意思,依個人理解,意思是:UINavigationController中當前活動的視圖控制器UIViewController與UINavigationBar棧中當前活動的UINavigationItem一一對應,處於同一層次。

用下圖來表示:

順序一:

順序二:

區別:
1. UINavigationBarUINavigationItem
navigationBar包含整個navigationItem的棧,管理整個navigationController的navigationItem( NSArray *items 屬性)。
navigationItem包含了bar視圖的全部元素(如title,tileview,backBarButtonItem等),受當前viewcontroller管理,即bar形成整個nv的導航視圖,然后每個nv頁面的導航欄元素由所在頁面的navigationItem管理
 
 
2.self.navigationController.navigationItem 與 self.navigationItem

首先,self.navigationItem不難理解,代表當前控制器的UINavigationItem;

 

至於self.navigationController.navigationItem,需要先解釋一下,self.navigationController是什么意思——

  1. 可以簡單理解為:self.navigationController代表訪問全局UINavigationController中的當前活動視圖(其實就是控制器自己)。如果當前控制器不處在UINavigationController中,則獲取不到navigationController屬性(值為nil);  
 
 

概括為——每個UIViewController內部都定義了一個navigationController屬性,它代表的是已被壓入UINavigationController棧中的當前控制器自身(self)!

 

如果當前控制器未壓入棧,self.navigationController=nil;如果控制器已壓入棧,self.navigationController=self

現在就可以解答問題了:self.navigationItem、self.navigationController.navigationItem作用一樣,但前提必須是此視圖控制器已經壓入全局的UINavigationController棧中。所以建議最好使用self.navigationItem,防止因當前視圖控制器沒有壓入棧而調用不到控制器自身的navigationItem屬性。

可能有人要問,已經有self指針了,那self.navigationController這種設計不是多次一舉嗎?本人的看法是,它可以用於判斷當前控制器是否已被壓入棧,以此做出不同響應,比如使用下方代碼:

[plain]  view plain  copy
 
  1. if(self.navigationController)  
  2. {  
  3.     //屬性不為nil  
  4.     代碼1  
  5. }  
  6. else  
  7. {  
  8.     //屬性為nil  
  9.     代碼2(比如提示未入棧警告)  
  10. }  
 
3. self.navigationController. tabBarItem 與  self.tabBarItem
和self.navigationController.navigationItem 與 self.navigationItem 的區別基本差不多
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM