1、 UINavigationController 是一個容器類。里面盛放的是UIViewController。
容器的意思是,如果你不放入UIViewController,里面就是空的,什么也沒有。
這個容器在管理UIViewController時,遵循棧管理的原則(后進先出)。
2、UINavigationController雖然是個容器,但也不是干巴巴的空殼。它由以下四部分組成:Navigation toolbar、Custom content、Navigation bar、,Navigation view。其中,我猜測,入棧的UIViewController 其界面應該就展示在Custom content區域。

概述:
UINavigationController:是一個ViewController,導航欄控制器,其通過棧來直接控制了其下的viewController。可通過此設置全局導航欄屬性。如導航欄背景或title顏色等。子視圖會繼承這些屬性,具體見下面“初始化UINavigationController”
簡單講:
全局唯一的UINavigationController棧生成全局唯一的UINavigationBar棧,UINavigationController中的每個UIViewController管理UINavigationBar(UINavigationController棧每個UIViewController將自身的屬性:navigationItem壓入或彈出UINavigationBar)。
兩個棧——UINavigationController棧、UINavigationBar棧,從層次關系上來說,是一一對應的:
上方注釋的意思,依個人理解,意思是:UINavigationController中當前活動的視圖控制器UIViewController與UINavigationBar棧中當前活動的UINavigationItem一一對應,處於同一層次。
用下圖來表示:
順序一:
順序二:
首先,self.navigationItem不難理解,代表當前控制器的UINavigationItem;
至於self.navigationController.navigationItem,需要先解釋一下,self.navigationController是什么意思——
- 可以簡單理解為: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這種設計不是多次一舉嗎?本人的看法是,它可以用於判斷當前控制器是否已被壓入棧,以此做出不同響應,比如使用下方代碼:
- if(self.navigationController)
- {
- //屬性不為nil
- 代碼1
- }
- else
- {
- //屬性為nil
- 代碼2(比如提示未入棧警告)
- }