UINavigationController
UINavigationController 類實現了一個用于管理分層內容導航的專用視圖控制器。 該導航界面可以有效地呈現您的數據,并使用戶更容易瀏覽該內容。 您通常按照原樣使用此類,但您也可以使用子類來自定義類的行為。
預覽
導航界面呈現的屏幕通常會模擬您的數據層次結構。 在層次結構的每個級別中,您提供一個適當的屏幕(由自定義視圖控制器管理)來顯示該級別的內容。 圖1顯示了iOS模擬器中“設置”應用程序提供的導航界面的示例。 第一個屏幕向用戶顯示包含首選項的應用程序列表。 選擇應用程序會顯示該應用程序的各個設置和設置組。 選擇組會產生更多設置等等。 除了根視圖之外,導航控制器提供一個后退按鈕,以允許用戶返回到上一層次結構。
導航控制器對象使用(由視圖控制器數組表示的)導航堆棧(navigation stack)管理當前顯示的屏幕。 數組中的第一個視圖控制器是根視圖控制器。 數組中的最后一個視圖控制器是當前正在顯示的視圖控制器。 您可以使用 segue 或使用此類中的方法從堆棧中添加和刪除視圖控制器。 用戶還可以使用導航欄中的后退按鈕或使用左側滑動手勢來移除最上面的視圖控制器。
導航控制器管理界面頂部的導航欄和界面底部的可選工具欄。 導航欄始終存在,并由導航控制器本身管理,導航控制器本身使用導航堆棧上的視圖控制器提供的內容來更新導航欄。 當 toolbarHidden
屬性為 NO
時,導航控制器將以最上層視圖控制器提供的內容類似地更新工具欄。
導航控制器使用委托(delegate)對象協調其行為。 委托對象可以覆蓋視圖控制器的推送或彈出,提供自定義的轉換動畫,并指定導航界面的首選方向。 您提供的委托對象必須遵守 UINavigationControllerDelegate
協議。
圖2顯示了導航控制器與其管理對象之間的關系。 使用導航控制器的指定屬性訪問這些對象。
導航控制器視圖
導航控制器是一個容器視圖控制器——也就是說,它將其他視圖控制器的內容嵌入到其中。 您可以從其 view
屬性訪問導航控制器的視圖。 此視圖包含導航欄,可選的工具欄以及與最上層視圖控制器對應的內容視圖。 圖3顯示了如何組合這些視圖來呈現整個導航界面。 (在該圖中,導航界面進一步嵌入到 tab bar 界面中。)雖然導航欄和工具欄視圖的內容發生變化,但視圖本身不會。 實際更改的唯一視圖是導航堆棧上最上層視圖控制器提供的自定義內容視圖。
注意
在iOS 7及更高版本中,因為內容視圖在導航欄下方,您必須在設計視圖控制器內容時考慮該空間。
導航控制器管理導航欄和可選導航工具欄的創建,配置和顯示。 允許自定義導航欄的外觀相關屬性,但是千萬不要直接更改其 frame
,bounds
或 alpha
值。 如果您將 UINavigationBar 子類化,則必須使用initWithNavigationBarClass:toolbarClass:
方法初始化導航控制器。 要隱藏或顯示導航欄,請使用navigationBarHidden
屬性或 setNavigationBarHidden:animated:
方法。
導航控制器使用與導航堆棧上的視圖控制器相關聯的導航項目對象(UINavigationItem 類的實例)動態構建導航欄的內容。 要定制導航欄的整體外觀,請使用 UIAppearance API。 要更改導航欄的內容,您必須配置自定義視圖控制器的導航項。 有關導航項的更多信息,請參閱 UINavigationItem。
更新導航欄(Navigation Bar)
每次頂層的視圖控制器更改時,導航控制器會相應地更新導航欄。 具體地,導航控制器更新顯示在三個導航欄位置中的每一個的欄按鈕項:左,中,右。 按鈕項是 UIBarButtonItem 類的實例。 您可以使用自定義內容創建按鈕項,或根據需要創建標準系統按鈕項。
導航欄的 tint 由導航欄本身的屬性控制。 使用 tintColor
屬性更改導航欄中 Item 的顏色,并使用 barTintColor
屬性來更改導航欄本身的顏色。 導航欄不會從當前顯示的視圖控制器中繼承其 tintColor。
有關導航欄的更多信息,請參閱 UINavigationBar。 有關如何創建條形按鈕項的更多信息,請參閱 UIBarButtonItem。
The Left Item
除了導航堆棧上的根視圖控制器之外,導航欄左側的 Item 可以導航返回到上一個視圖控制器。 這個最左邊按鈕的內容確定如下:
- 如果新創建的最頂層視圖控制器具有自定義的左欄按鈕Item,則顯示該Item。 要指定自定義左欄按鈕,請設置視圖控制器導航項目的
leftBarButtonItem
屬性。 - 如果最頂層視圖控制器沒有自定義左欄按鈕項,但是上一個視圖控件的導航項在其
backBarButtonItem
屬性中有一個對象,導航欄將顯示該項。 - 如果任何一個視圖控制器都沒有指定自定義導航欄欄按鈕項,則使用默認的后退按鈕,并將該按鈕的標題設置為上一個視圖控制器的
title
屬性的值,即視圖控制器下一級堆棧。 (如果導航堆棧中只有一個視圖控制器,則不顯示后退按鈕。)
注釋
假設通過VC1
push
VC2,那么如果設置VC1.navigationItem.backBarButtonItem
就會顯示在VC2的左上角返回按鈕;如果再設置VC2.navigationItem.leftBarButtonItem
則會覆蓋VC1的設置;如果VC1和VC2都沒有設置,則會顯示默認的backBarButtonItem
,它的標題是VC1的title
。
注意
如果后退按鈕的標題太長而不能放在可用空間中,則導航欄可以將字符串“后退”替換實際的按鈕標題。 只有后退按鈕由前一個視圖控制器提供時,導航欄才會執行此操作。 就算新的頂級視圖控制器自定義了左欄返回按鈕項 - 該導航項的
leftBarButtonItem
或leftBarButtonItems
屬性中的對象 - 導航欄也不會更改按鈕標題。
The Middle Item
導航控制器更新導航欄的中間項,如下所示:
- 如果新的頂級視圖控制器具有自定義標題視圖,則導航欄將顯示該視圖以替代默認標題視圖。 要指定自定義標題視圖,請設置視圖控制器導航項的
titleView
屬性。 - 如果沒有設置自定義標題視圖,則導航欄將顯示包含視圖控制器默認標題的標簽。 該標簽的字符串通常從視圖控制器本身的
title
屬性獲取。 如果要顯示與視圖控制器相關的標題不同的標題,請改為設置視圖控制器導航項的標題屬性。
The Right Item
導航控制器更新導航欄的右側項,如下所示:
- 如果新的頂級視圖控制器具有自定義右鍵按鈕項目,則顯示該項目。 要指定自定義右鍵按鈕項目,請設置視圖控制器導航項目的
rightBarButtonItem
屬性。 - 如果沒有指定自定義的右欄按鈕項目,則導航欄在該欄的右側不顯示。
展示Toolbar
導航控制器對象在其視圖層次結構中管理可選工具欄(Toolbar)。顯示時,此工具欄從活動視圖控制器的toolbarItems
屬性中獲取其當前的一組項目。當前視圖控制器更改時,導航控制器更新工具欄項目以匹配新的視圖控制器,在適當時將新項目動畫化。
導航工具欄默認隱藏,但您可以通過調用導航控制器對象的 setToolbarHidden:animated:
方法來顯示導航界面。如果不是所有的視圖控制器都支持工具欄項,您的委托對象可以調用此方法在隨后的推送和彈出操作期間切換工具欄的可見性。要使用自定義 UIToolbar 子類,請使用 initWithNavigationBarClass:toolbarClass:
方法初始化導航控制器。如果您使用自定義工具欄和導航欄子類來創建導航控制器,請注意,在將導航控制器顯示在屏幕上之前,請注意您需要按下并設置視圖控制器。
適應不同環境
導航界面在水平緊湊和水平正常的環境中保持不變。 當在兩個環境之間切換時,只有導航控制器視圖的大小發生變化。 導航控制器不會更改其視圖層次結構或其視圖的布局。
當在導航堆棧上配置視圖控制器之間的 segues 時,標準的 Show 和 Show Detail 行為如下:
- Show segue—導航控制器將指定的視圖控制器 push 入其導航堆棧。
- Show Detail segue—導航控制器以模態方式呈現指定的視圖控制器。
其他 segues類型的行為不變。
Interface Behaviors
導航控制器為其界面支持以下行為:
-
Supported interface orientations (支持的接口方向) - 確定支持的接口方向時,導航控制器對象不會在其導航堆棧上查看視圖控制器。 在iPhone上,導航控制器支持除肖像上下顛倒之外的所有方向。 在iPad上,導航控制器支持所有方向。 如果導航控制器具有委托對象,則委托可以使用
navigationControllerSupportedInterfaceOrientations:
方法指定一組不同的支持方向。 -
Presentation context (演示文稿上下文) - 導航控制器定義了模態呈現視圖控制器的呈現上下文。 當模態轉換樣式為
UIModalPresentationCurrentContext
或UIModalPresentationOverCurrentContext
時,導航堆棧中的視圖控制器的模態呈現覆蓋整個導航界面。
保存狀態
在iOS 6及更高版本中,如果為此視圖控制器的 restoreIdentifier
屬性分配值,則會嘗試在其導航堆棧上保留子視圖控制器。 導航控制器從堆棧底部開始向上移動,對每個具有有效恢復標識符字符串的視圖控制器進行編碼。 在下一個啟動周期中,導航控制器將保留的視圖控制器按照保留的順序恢復到導航堆棧。
推送到導航堆棧的子視圖控制器可能使用相同的恢復標識符。 導航控制器自動存儲附加信息,以確保每個孩子的恢復路徑是唯一的。