[TOC=5]
* * * * *
>原文鏈接 :[The Role of View Controllers](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/index.html#//apple_ref/doc/uid/TP40007457-CH2-SW1)
視圖控制器是你的應用程序內部結構的基礎。 每個應用程序至少有一個視圖控制器,大多數應用程序有幾個。 每個視圖控制器管理你的應用程序用戶界面中的一部分,以及該界面和底層數據之間的交互。 視圖控制器也便于您的應用在不同用戶界面的之間的轉換。
由于在你的應用中扮演著如此重要的角色,視圖控制器幾乎是你所做的一切的中心。 UIViewController 類定義了用來管理視圖,處理事件,從一個視圖控制器轉換到另一個視圖控制器,以及協調你的應用程序的其他部分的方法和屬性。 您可以繼承 UIViewController(或其子類之一)并添加實現應用程序行為所需的自定義代碼。
視圖控制器分兩種類型:
* 內容視圖控制器,管理你的應用程序內容的一個離散部分,主要使用類型。
* 容器視圖控制器,用方便導航的形式管理和展示子視圖控制器的內容。
大多數應用程序是兩種類型的視圖控制器組合而成。
### 視圖管理
視圖控制器最重要的作用是管理視圖的層次結構。 每個視圖控制器都有一個包含所有視圖控制器內容的根視圖。 在根視圖中,可以添加需要顯示內容的視圖。 圖1-1顯示了視圖控制器和視圖之間的內在關系。 視圖控制器總是具有對其根視圖的引用,并且每個視圖都具有對其子視圖的強引用。
###### 圖 1-1 視圖控制器與其視圖之間的關系

> 注意
> 通常的做法是使用 outlets 訪問視圖控制器的視圖層次結構中的其他視圖。 由于視圖控制器管理其所有視圖的內容,因此可讓您存儲對所需視圖的引用。 當視圖從故事板加載時, outlets 本身自動連接到實際的視圖對象。
內容視圖控制器自己管理其所有視圖。 容器視圖控制器管理其自己的視圖以及來自其一個或多個子視圖控制器的根視圖。 其不管理其子視圖控制器的具體內容。 它只管理子視圖控制器的根視圖,根據容器的設計大小對根視圖進行布局。 圖 1-2 說明了 UISplitViewController 及其子項之間的關系。 UISplitViewController 管理其子視圖控制器的根視圖的大小和位置,子視圖控制器的根視圖管理這些視圖的實際內容。
###### 圖1-2 視圖控制器管理來自其他視圖控制器的內容

有關管理視圖控制器視圖的信息,請參閱 [Managing View Layout](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/DefiningYourSubclass.html#//apple_ref/doc/uid/TP40007457-CH7-SW6)。
### 數據傳遞
視圖控制器充當它管理的視圖和你的應用的數據之間的媒介。 UIViewController 的方法和屬性方便管理應用程序的展示內容。 當你的子類繼承UIViewController的時候,你可以在子類中添加任何變量以便管理你的數據。 添加自定義變量會創建一個如圖 1-3 所示的關系,其中視圖控制器具有對數據以及用來展示數據視圖的引用。 需要你在兩者之間來回傳遞數據。
###### 圖1-3 視圖控制器在數據對象和視圖之間進行協調

你應該始終在視圖控制器和數據對象之間保持清晰的職責分離。 大多數確保數據結構完整性的邏輯屬于數據對象本身。 視圖控制器可以驗證來自視圖的輸入,然后以數據對象需要的格式打包輸入,但是應該最小化視圖控制器在管理實際數據中的角色。
UIDocument 對象是一種獨立于視圖控制器管理數據的方法。 文檔對象是一個知道如何讀寫數據到持久存儲的控制器對象。 當你子類化時,你可以添加任何你需要的邏輯和方法來提取數據,并將其傳遞給視圖控制器或其他應用程序的一部分。 視圖控制器可以存儲它接收的任何數據的副本,以便更新視圖,但文檔仍然擁有真正的數據。
### 用戶交互
視圖控制器是響應者對象,能夠處理響應者鏈中的事件。 雖然他們能夠這樣做,但視圖控制器很少直接處理觸摸事件。 相反,視圖通常會處理自己的觸摸事件,并將結果報告給關聯的委托或目標對象(通常是視圖控制器)的方法。 因此,視圖控制器中的大多數事件都是使用委托方法或操作方法處理的。
有關在視圖控制器中實現操作方法的更多信息,請參閱 [Handling User Interactions](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/DefiningYourSubclass.html#//apple_ref/doc/uid/TP40007457-CH7-SW11) 。
### 資源管理
視圖控制器負責管理其視圖和其創建的任何對象。 UIViewController 自動完成視圖管理的大多數工作。 例如,UIKit 自動釋放視圖不再需要的任何相關的資源。 在你的UIViewController 子類中,你負責管理自己創建的對象。
當可用空閑內存不足時,UIKit 會要求應用程序釋放不再需要的資源。其中一種方式是通過調用視圖控制器的 didReceiveMemoryWarning 方法。 使用該方法刪除對不再需要或稍后可以輕松地重新創建的對象。 例如,可以使用該方法刪除緩存的數據。 發生內存不足情況時,盡可能多的釋放內存非常重要。 消耗太多內存的應用程序可能會被系統徹底終止以恢復內存。
### 適應性
視圖控制器負責呈現其視圖內容并使根據基礎環境對視圖進行適配。 每個iOS應用程序都應該能夠在iPad上運行,并且可以在幾種不同大小的iPhone上運行。 與其為每個設備提供不同的視圖控制器和視圖層次結構,不如使用單個視圖控制器通過簡單地調整其視圖以適應不斷變化的空間需求。
在iOS中,視圖控制器需要處理粗粒度的變化和細粒度的變化(很有可能指分辨率)。當視圖控制器的特性改變時,會發生粗粒度的變化。 特性是描述整體環境的屬性,例如顯示比例。 其中兩個最重要的特性是視圖控制器的水平和垂直尺寸,它們表示視圖控制器在給定維度中有多少空間。 您可以使用 size class 更改來改變布局視圖的方式,如圖1-4所示。當水平尺寸類別是正常的,視圖控制器利用額外的水平空間來排列其內容。 當水平尺寸級別緊湊時,視圖控制器垂直排列其內容。
###### 圖1-4 調整視圖以適應尺寸變化

在一個給定的空間中,在任何時候都有可能出現更細粒度的更改。當用戶將iPhone從豎屏轉到橫向時,空間大小可能不會改變,但屏幕尺寸通常會發生變化。當你使用自動布局時,UIKit 會自動調整視圖的大小和位置以匹配新的維度(坐標系)。視圖控制器可以根據需要進行額外的調整。
有關適應性的更多信息,請參見 [The Adaptive Model](https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/TheAdaptiveModel.html#//apple_ref/doc/uid/TP40007457-CH19-SW1)。