[Foundation.Register("UIViewController", true)]
public class UIViewController : UIKit.UIResponder, Foundation.INSCoding, Foundation.INSExtensionRequestHandling, IDisposable, System.Collections.IEnumerable, UIKit.IUIAppearanceContainer, UIKit.IUIContentContainer, UIKit.IUIFocusEnvironment, UIKit.IUITraitEnvironment
type UIViewController = class
    inherit UIResponder
    interface IEnumerable
    interface INSCoding
    interface INativeObject
    interface IDisposable
    interface INSExtensionRequestHandling
    interface IUIAppearanceContainer
    interface IUIContentContainer
    interface IUIFocusEnvironment
    interface IUITraitEnvironment
Object
UIViewController

類別 UIViewController 是檢視控制器階層的基類。 檢視控制器管理 UIView 和其他 UIViewController 。 iOS 應用程式有單一視窗,但有許多畫面,每個畫面可能包含數 UIView 個。 管理這些畫面很複雜,而且需要回應模型中的使用者輸入和變更, (問題領域) 。 此管理和協調是 的 UIViewController 作業。

UIViewController 有 3 個主要責任:

  • 配置其元件 UIView 。 這包括調整大小、回應方向變更等等。
  • 重新建構顯示以回應輸入事件或模型類別的狀態
  • 將使用者輸入轉譯為平臺中性模型服務要求

iOS 提供許多標準檢視控制器,例如 UINavigationController UITabBarController UIPageViewController 。 一般而言,應用程式開發人員應該偏好使用標準檢視控制器來建立整體顯示結構。 使用標準檢視控制器可提供一致的標準行為,並讓應用程式更容易符合 iOS 人為介面指導方針

此外,應用程式開發人員通常需要實作一或多個「內容檢視控制器」。 這些通常衍生自 UIViewController UITableViewController 。 內容檢視控制器是應用程式開發人員撰寫自訂程式碼,以滿足 UIViewController 先前所述的責任。 在利用 Apple 介面產生器的 Xamarin Studio 程式碼後置功能的應用程式中,Xamarin Studio 會自動產生此自訂程式碼。 使用 MonoTouch.Dialog 撰寫的應用程式通常不需要自訂撰寫的內容檢視控制器,但可能會使用一個用於架構一致性。

單一檢視控制器可能會有許多檢視和子標籤,但通常單一檢視控制器會有單一根檢視,而且主要考慮控制該檢視,或主要考慮維護子控制項的集合。 在下列範例中,取自 「Hello World iPhone」 範例,類型的內容 HelloWorld_iPhoneViewController 檢視控制器會具現化,並設定 RootViewController 為應用程式的視窗 :

public override bool FinishedLaunching (UIApplication app, NSDictionary options)
       // create a new window instance based on the screen size
       window = new UIWindow (UIScreen.MainScreen.Bounds);
       viewController = new HelloWorld_iPhoneViewController ("HelloWorld_iPhoneViewController", null);
       window.RootViewController = viewController;
       window.MakeKeyAndVisible ();
       return true;
 

相反地,下列程式碼取自 「iOS 標準控制項」範例會示範 如何使用 UITableViewController 應用程式定義 NavItemGroup 來管理一系列其他 UIViewController 專案。 在此程式碼中 NavItem ,建構函式的第二個參數是資料表中選取該專案時所需的特定 UIViewController 子類型:

navGroup = new NavItemGroup ("Toolbars");
navItems.Add (navGroup);
navGroup.Items.Add (new NavItem ("Toolbar 1", "", typeof(Toolbar.Toolbar1_iPhone)));
navGroup.Items.Add (new NavItem ("Programmatic Toolbar", "", typeof(Toolbar.ProgrammaticToolbar_Controller)));
navGroup.Items.Add (new NavItem ("Toolbar Items", "", typeof(Toolbar.ToolbarItems)));
// create a table source from our nav items
tableSource = new NavItemTableSource (this.NavigationController, navItems);
// set the source on the table to our data source
base.TableView.Source = tableSource;
 

UIViewController 和 MVC 架構

下圖顯示模型、檢視和控制器類別之間的傳統關聯性。 箭號表示相依性:檢視相依于模型類別以提供資料,控制器相依于 Model 類別,以取得要顯示的內容,以及視 View 類別執行繪圖的資訊而定。 此圖表很理想:模型中有數個類別、數個檢視、 UIView 實際可用來 NextResponder 判斷其 UIViewController 等類別。

  • Model 類別對相關聯的檢視和控制器類別沒有了解。 這可讓模型獨立發展,並大幅改善可維護性和可攜性
  • 事件處理常式會在考慮的區域之間使用。 這允許僅包含與該事件相關的資料之強型別 T:System.EventArgs 。 這可藉由限制用戶端物件的事件提供者範圍存取來改善可維護性。
  • 控制器會回應檢視和模型的事件。 UIViewController 例如,要求 Model 在攝氏和華氏溫度單位之間轉換,以處理 TouchUpInside 輸入事件。 相反地,它可能會藉由變更顯示 (讓顯示成為警告圖示或部分) 來回應模型「太忙碌」事件。 View 會更新其顯示,以回應 Model 事件所提供的新資料。 檢視類別應盡可能被動。 不可維護軟體中最常見的錯誤之一是 View 類別,該類別會作為控制器或「觸達」資料模型,而不是接受傳入做為事件引數的值。

UIViewController、介面產生器、分鏡腳本和 Nib 檔案

XCode Apple 的 IDE 包含 Interface Builder (「IB」) ,此工具可讓使用者介面以互動方式建立,並儲存為 「Nib」 檔案, (這些檔案會以 XML 格式與 「.xib」 延伸模組) 儲存。 Xamarin Studio 會產生 nib 檔案的程式碼後置類別,而且通常這些是 的 UIViewController 子類別。 從 iOS 5 開始,應用程式開發人員可以使用「分鏡腳本」,以視覺化方式指定個別 UIViewController 的流覽。 如需分鏡腳本的詳細資訊,請參閱 分鏡腳本簡介

通用應用程式

Xamarin Studio 完全支援使用單 UIViewController 一來控制針對 iPad 或 iPhone 自訂的多個 UIView s 的通用應用程式。 只要 UIView 兩個裝置使用的 相同元素,就可以共用相同的輸出和動作,如「 iPad + 通用 (iPhone + iPad) Apps 」指南中所述。

不過,iPhone 和 iPad 版本不需要使用相同的 UI 元素。 應用程式開發人員可能會想要利用 iPad 上可用的增加螢幕實際空間和較大的控制項集。 在這種情況下,應用程式開發人員應該使用類似下列的程式碼來建立個別 UIViewController 的 ,並使用類似下列的程式碼載入它們,同樣取自「 iPad + 通用 (iPhone + iPad) Apps 」指南。 要載入的 UIViewController 選擇取決於呼叫

狀態還原

如果您想要在類別中提供狀態還原,您必須手動將具有下列簽章的方法新增至類別:

UIViewController 子類別

類別 使用案例 範例影像
UIActivityViewController 從一組可能的活動中選擇
UIPageViewController 以一系列頁面的形式呈現內容檢視控制器
UINavigationController 一次呈現一個內容檢視控制器,其中包含標頭和選擇性工具列
UIImagePickerController 選取和拍攝相片的標準 UINavigationController
UIVideoEditorController 檢閱和編輯視訊和音訊檔案的標準 UINavigationController
UITabBarController 一次呈現一個檢視控制器的最上層控制器,由畫面底部的工具列選取。
UIReferenceLibraryViewController 標準檢視控制器,呈現詞彙和其字典定義。
UISplitViewController 顯示並存檢視控制器的僅限 iPad 檢視控制器。
UICollectionViewController 有效率地顯示大量的儲存格,並以彈性的方式排列。
UITableViewController 有效率地顯示大量的儲存格,並垂直排列。

調適型版面配置和旋轉

從 iOS 8 開始,iOS 8 引進了一系列慣用語,可協助開發人員建立應用程式和 UIViewControllers,以使用不同的尺寸規格,例如 iPhone 和 iPad。

這會取代 iOS8 之前的設計,其著重于支援兩個不同的尺寸規格, (iPhone 或 iPad) 特定方向,以及支援從一個介面方向到另一個介面方向的轉換。

在 UI 上配置元素時,新的應用程式應該考慮一些變數。 其中包括畫布中可用的大小、UserInterfaceIdiom (iPad 或 iPhone) 、顯示縮放比例,以及垂直和水準大小類別。 第一個是主要檢視的大小,其餘部分則儲存在 中 TraitCollection

輪替現在被視為類別大小變更。 例如,以直向模式保留的 iPhone 具有一般高度和精簡寬度。 當您將它切換為橫向時,它會變成精簡的高度和一般寬度。

應用程式可以覆寫 TraitCollectionDidChange(UITraitCollection) 以回應任何使用者介面特性的變更。 此方法會在輪替期間叫用,或變更影響應用程式大小類別的使用者介面。

當輪替發生時,會 ViewWillTransitionToSize(CGSize, IUIViewControllerTransitionCoordinator) 叫用 方法。

MVC、MVP 和 MVVM

.NET 開發人員會熟悉 Microsoft 升級的架構,其目標與 MVC 相同。 Model-View-Presenter (MVP) 和 Model-View-ViewModel (MVVM) 致力於維護模型類別和顯示類別之間的分隔。 熟悉 MVP 的開發人員將用於模型資料,透過協調 Presenter 物件的檢視,而不是使用 MVC 模型,讓 Views 直接訂閱模型事件。 藉由增加 UIViewController 的責任,可以在 iOS 中執行 MVP 架構。 MVVM 的定義特性是使用資料系結來確保 View 物件是回應式的。 iOS 控制項不支援資料系結,因此無法使用 MVVM。 MVVM 開發人員將用於檢視和模型物件之間的「防火牆」,比 MVC 中可用的還要多。 MVVM 開發人員應該提醒自己確保其 View 物件盡可能回應,而且不會觸達模型以取得資料或接管控制器責任。

UIViewController 和 MonoTouch.Dialog

MonoTouch.Dialog (「MT.D「) 允許使用宣告式語句快速建置複雜的 UI。 相對於使用 Apple 介面產生器所建置的應用程式,大部分 MT。D 應用程式會使用預先定義的 DialogViewController ,而且不會建立自己的子類別 UIViewController 。 如需詳細資訊,請參閱 命名空間檔和 MonoTouch.Dialog 簡介 一文。

使用 NSString keyPath) 在外部 (註冊要觀察的物件。   觀察到的變更會分派至觀察者的 物件 ObserveValue(NSString, NSObject, NSDictionary, IntPtr) 方法。

(繼承來源 NSObject )

使用字串 keyPath) 在外部 (註冊要觀察的物件。   觀察到的變更會分派至觀察者的 物件 ObserveValue(NSString, NSObject, NSDictionary, IntPtr) 方法。

(繼承來源 NSObject )