共用方式為


Xamarin.Mac 中的 .xib 檔案

本文涵蓋使用在 Xcode 的 Interface Builder 中建立的 .xib 檔案,以建立及維護 Xamarin.Mac 應用程式的使用者介面。

注意

建立 Xamarin.Mac 應用程式使用者介面的慣用方式是腳本。 由於歷史原因,以及使用較舊的 Xamarin.Mac 專案,此檔已就緒。 如需詳細資訊,請參閱我們的 分鏡腳本 簡介檔。

概觀

在 Xamarin.Mac 應用程式中使用 C# 和 .NET 時,您可以存取開發人員在 和 XcodeObjective-C運作的相同使用者介面元素和工具。 由於 Xamarin.Mac 直接與 Xcode 整合,因此您可以使用 Xcode 的 Interface Builder 來建立和維護您的使用者介面(或選擇性地直接在 C# 程式代碼中建立它們)。

macOS 會使用 .xib 檔案來定義應用程式使用者介面的元素(例如功能表、Windows、檢視、卷標、文字字段),這些元素是以圖形方式在 Xcode 的介面產生器中建立和維護。

執行中應用程式的範例

在本文中,我們將討論在 Xamarin.Mac 應用程式中使用 .xib 檔案的基本概念。 強烈建議您先完成 Hello, Mac 文章,因為它涵蓋我們將在本文中使用的重要概念和技術。

您可能也想要查看 Xamarin.Mac Internals 檔的公開 C# 類別/方法Objective-C一節,它也會說明 Register 用來將 C# 類別連線至Objective-C物件和 UI 元素的 和 Export 屬性。

Xcode 和 Interface Builder 簡介

作為 Xcode 的一部分,Apple 已建立名為 Interface Builder 的工具,可讓您在設計工具中以可視化方式建立使用者介面。 Xamarin.Mac 與 Interface Builder 整合,可讓您使用使用者執行的相同工具 Objective-C 來建立 UI。

Xcode 的元件

當您從 Visual Studio for Mac 在 Xcode 中開啟 .xib 檔案時,它會以左側的 Project Navigator、中間的 [介面階層] 和 [介面編輯器] 以及右側的 [屬性和公用程式] 區段開啟:

Xcode UI 的元件

讓我們看看這些 Xcode 區段的功能,以及如何使用這些區段來建立 Xamarin.Mac 應用程式的介面。

項目導覽

當您在 Xcode 中開啟 .xib 檔案以進行編輯時,Visual Studio for Mac 會在背景中建立 Xcode 項目檔,以在本身與 Xcode 之間通訊變更。 稍後,當您從 Xcode 切換回 Visual Studio for Mac 時,此專案所做的任何變更會與 Visual Studio for Mac 的 Xamarin.Mac 專案同步處理。

[項目流覽] 區段可讓您在組成此填充碼 Xcode 專案的所有檔案之間巡覽。 一般而言,您只對這份清單中的 .xib 檔案感興趣,例如 MainMenu.xibMainWindow.xib

介面階層

[ 介面階層] 區段可讓您輕鬆地存取使用者介面的數個主要屬性,例如其 佔位元 和主 視窗。 您也可以使用本節來存取組成使用者介面的個別元素(檢視),以及藉由在階層內拖曳它們來調整其巢狀方式。

介面編輯器

[介面編輯器]段提供您以圖形方式配置使用者介面的介面。 您將從 [屬性與公用程式] 區段的 [連結庫] 區段拖曳元素,以建立您的設計。 當您將使用者介面元素(檢視)新增至設計介面時,它們會依介面編輯器出現的順序新增至 [介面階層] 區段。

屬性和公用程式

[屬性和公用程式] 區段分成兩個主要區段,我們將使用的屬性(也稱為 Inspectors)和連結

屬性偵測器

一開始,這個區段幾乎是空的,不過,如果您在 [介面編輯器] 或 [介面階層] 中選取某個元素,[屬性] 區段將會填入有關您可以調整之指定元素和屬性的資訊。

在 [屬性] 區段內,共有 8 個不同的「偵測器索引標籤」,如下圖所示:

所有偵測器的概觀

這些索引標籤從左到右分別是:

  • 檔案偵測器 – 檔案偵測器顯示檔案資訊,例如正在編輯之 Xib 檔案的檔案名稱和位置。
  • 快速說明 – [快速說明] 索引標籤提供內容相關的說明,以在 Xcode 中選取的項目為基礎。
  • 身分識別偵測器 – 身分識別偵測器提供關於所選控制項/檢視的相關資訊。
  • 屬性偵測器 – 屬性偵測 器可讓您自定義所選控件/檢視的各種屬性。
  • 大小偵測器 – 大小偵測 器可讓您控制所選控件/檢視的大小和重設大小行為。
  • 連線 偵測器 – 連線 檢閱程式會顯示所選控件的輸出和動作連線。 我們會在短短的一刻內檢查出口和動作。
  • 系結偵測器 – Bindings Inspector 可讓您設定控件,使其值自動系結至數據模型。
  • 檢視效果偵測器 – 檢視效果偵測 器可讓您指定控件的效果,例如動畫。

在 [ 連結庫 ] 區段中,您可以尋找要放入設計工具中的控件和物件,以圖形方式建置您的使用者介面:

連結庫偵測器的範例

現在您已熟悉 Xcode IDE 和 Interface Builder,讓我們看看如何使用它來建立使用者介面。

在 Xcode 中建立和維護視窗

建立 Xamarin.Mac 應用程式使用者介面的慣用方法是使用分鏡腳本(請參閱我們的 分鏡腳本簡介 檔以取得詳細資訊),因此,在 Xamarin.Mac 中啟動的任何新專案默認都會使用 Storyboards。

若要切換至使用以 .xib 為基礎的 UI,請執行下列動作:

  1. 開啟 Visual Studio for Mac 並啟動新的 Xamarin.Mac 專案。

  2. 在 Solution Pad 中,以滑鼠右鍵按兩下專案,然後選取 [新增>檔案...

  3. 選取 Mac>Windows 控制器:

    新增視窗控制器

  4. 輸入 MainWindow 名稱,然後按兩下 [ 新增 ] 按鈕:

    新增主視窗

  5. 再次以滑鼠右鍵按兩下項目,然後選取[ 新增>檔案...

  6. 選取 [Mac>主功能表]:

    新增主功能表

  7. 將名稱保留為 MainMenu ,然後按兩下 [ 新增 ] 按鈕。

  8. Solution Pad選取 Main.storyboard 檔案,以滑鼠右鍵按兩下並選取 [ 移除]:

    選取主分鏡腳本

  9. 在 [移除對話框] 中,按下 [ 刪除] 按鈕:

    確認刪除

  10. Solution Pad 中,按兩下 Info.plist 檔案以開啟它以進行編輯。

  11. 從 [主要介面] 下拉式清單中選取MainMenu

    設定主功能表

  12. 在 Solution Pad,按兩下 MainMenu.xib 檔案,以開啟它以在 Xcode 的介面產生器中編輯。

  13. 在 [ 鏈接庫偵測器] 中,輸入 object 搜尋欄位,然後將新的 物件 拖曳至設計介面:

    編輯主功能表

  14. 在 Identity Inspector 中,輸入 AppDelegate 類別

    選取應用程式委派

  15. [介面階層] 選取 [檔案擁有者],切換至 [連線 檢閱程式],並將一行從委派拖曳至剛新增至AppDelegate專案的 [物件]:

    連線 應用程式委派

  16. 儲存變更並返回Visual Studio for Mac。

完成上述所有變更后,請編輯 AppDelegate.cs 檔案,使其看起來如下所示:

using AppKit;
using Foundation;

namespace MacXib
{
    [Register ("AppDelegate")]
    public class AppDelegate : NSApplicationDelegate
    {
        public MainWindowController mainWindowController { get; set; }

        public AppDelegate ()
        {
        }

        public override void DidFinishLaunching (NSNotification notification)
        {
            // Insert code here to initialize your application
            mainWindowController = new MainWindowController ();
            mainWindowController.Window.MakeKeyAndOrderFront (this);
        }

        public override void WillTerminate (NSNotification notification)
        {
            // Insert code here to tear down your application
        }
    }
}

現在,應用程式的主視窗會在 新增視窗控制器時自動包含在專案中的 .xib 檔案中。 若要編輯您的 Windows 設計,請在 Solution Pad按兩下 MainWindow.xib 檔案:

選取MainWindow.xib 檔案

這會在 Xcode 的 Interface Builder 中開啟視窗設計:

編輯MainWindow.xib

標準視窗工作流程

對於您在 Xamarin.Mac 應用程式中建立及使用的任何視窗,程式基本上都相同:

  1. 對於非預設新增至專案的新視窗,請將新的視窗定義新增至專案。
  2. 按兩下 .xib 檔案開啟在 Xcode 介面產生器中編輯的視窗設計。
  3. 在屬性偵測器和大小偵測器設定任何必要的視窗屬性。
  4. 拖曳至建置介面所需的控件,並在屬性偵測器設定它們。
  5. 使用大小偵測器來處理UI元素的大小調整。
  6. 透過輸出和動作,將視窗的UI元素公開至 C# 程式代碼。
  7. 儲存變更並切換回 Visual Studio for Mac 以與 Xcode 同步。

設計視窗配置

在介面產生器中設定使用者介面的程式基本上與您新增的每個元素都相同:

  1. 在連結庫偵測器尋找所需的控件,並將它拖曳到 [介面編輯器] 並放置它。
  2. 在屬性偵測器設定任何必要的視窗屬性。
  3. 使用大小偵測器來處理UI元素的大小調整。
  4. 如果您使用自定義類別,請在 Identity Inspector設定它。
  5. 透過輸出和動作將UI元素公開至 C# 程式代碼。
  6. 儲存變更並切換回 Visual Studio for Mac 以與 Xcode 同步。

例如:

  1. 在 Xcode 中,從 [程式庫] 區段拖曳 [按鈕]

    從文檔庫選取按鈕

  2. 將按鈕卸除至 [介面編輯器] 中的 [視窗]:

    將按鈕新增至視窗

  3. 按一下 [屬性偵測器] 中的 [標題] 屬性,將按鈕的標題變更為 Click Me

    設定按鈕屬性

  4. 從 [程式庫] 區段拖曳 [標籤]

    在文檔庫中選取標籤

  5. 將標籤拖曳到 [介面編輯器] 中 [視窗] 上的按鈕旁:

    將標籤新增至視窗

  6. 抓住標籤上的右側控點,將它拖曳到視窗邊緣附近為止:

    調整標籤的大小

  7. 在介面編輯器仍選取標籤后,切換至 [大小偵測器]:

    選取大小偵測器

  8. 在 [ 自動重設大小] 方 塊中,按兩下 右側的 [暗紅色括弧 ] 和中央的 [暗紅色水準箭號 ]:

    編輯自動重設大小屬性

  9. 這可確保標籤會隨著視窗在執行中的應用程式中重設大小而延展並縮小。 [自動重設大小方塊] 方塊的上方和左方括弧會告知標籤在指定的 X 和 Y 位置。

  10. 將變更儲存至使用者介面

當您重設大小並移動控件時,您應該已經注意到 Interface Builder 會提供您以 OS X Human Interface Guidelines 為基礎的實用貼齊提示。 這些指導方針將協助您建立高品質的應用程式,以熟悉 Mac 使用者的外觀和風格。

如果您在 [ 介面階層 ] 區段中查看,請注意如何顯示構成使用者介面的專案配置和階層:

在 [介面階層] 中選取元素

您可以從這裡選取項目,視需要編輯或拖曳至重新排序 UI 元素。 例如,如果UI元素正由另一個元素所涵蓋,您可以將它拖曳到清單底部,使其成為視窗最上層的專案。

如需在 Xamarin.Mac 應用程式中使用 Windows 的詳細資訊,請參閱我們的 Windows 檔。

將 UI 元素公開至 C# 程式代碼

完成在 Interface Builder 中設定使用者介面的外觀和風格之後,您必須公開 UI 的元素,以便從 C# 程式代碼存取它們。 若要這樣做,您將使用動作和輸出。

設定自定義主視窗控制器

若要能夠建立輸出和動作,將UI元素公開至 C# 程式代碼,Xamarin.Mac 應用程式必須使用自定義視窗控制器。

執行下列操作:

  1. 在 Xcode 的 Interface Builder 中開啟應用程式的分鏡腳本。

  2. NSWindowController在[設計介面] 中選取 。

  3. 切換至 [ 身分識別偵測器 ] 檢視,然後輸入 WindowController 作為 [類別名稱]:

    編輯類別名稱

  4. 儲存變更並返回 Visual Studio for Mac 進行同步處理。

  5. WindowController.cs檔案將會新增至 Visual Studio for Mac 中 Solution Pad 中的專案

    Visual Studio for Mac 中的新類別名稱

  6. 在 Xcode 的介面產生器中重新開啟分鏡腳本。

  7. WindowController.h 檔案將可供使用:

    Xcode 中相符的 .h 檔案

輸出和動作

那麼,什麼是出口和動作? 在傳統的 .NET 使用者介面程式設計中,使用者介面的控制項在其加入時會自動公開為屬性。 在 Mac 中的運作方式則不同,只將控制項加入至檢視是無法讓程式碼存取的。 開發人員必須明確地將 UI 元素公開到程式碼。 為了這樣做,Apple 提供兩個選項:

  • 輸出 – 輸出類似屬性。 如果您將控件連線到輸出,它會透過 屬性向程式代碼公開,因此您可以執行附加事件處理程式、呼叫方法等動作。
  • 動作 – 動作類似 WPF 中的命令模式。 例如,在控件上執行動作時,例如按下按鈕,控件會自動在您的程式代碼中呼叫方法。 動作功能強大且方便,因為您可以將許多控件連線到相同的動作。

在 Xcode 中,輸出和動作會透過 控制拖曳直接在程式代碼中新增。 更具體來說,這表示若要建立輸出或動作,您可以選擇想要新增輸出或動作的控件元素、按住 鍵盤上的 [控件 ] 按鈕,然後將該控件直接拖曳到您的程式代碼中。

對於 Xamarin.Mac 開發人員,這表示您會拖曳到對應至 Objective-C 您要建立輸出或動作之 C# 檔案的存根檔案。 Visual Studio for Mac 建立名為 MainWindow.h 的檔案,做為其產生以使用介面產生器之填充碼 Xcode 專案的一部分:

Xcode 中 .h 檔案的範例

這個存根 .h 檔案會鏡像建立新的 NSWindow 時自動新增至 Xamarin.Mac 專案的MainWindow.designer.cs。 此檔案將用來同步處理 Interface Builder 所做的變更,而我們會在其中建立您的輸出和動作,讓 UI 元素公開給 C# 程式代碼。

新增輸出

讓我們來看看如何建立輸出,將UI元素公開至C#程式代碼的基本瞭解。

執行下列操作:

  1. 在 Xcode 中,於畫面較靠近右上角按一下 [雙圓形] 按鈕以開啟 [助理編輯器]

    選取助理編輯器

  2. Xcode 會切換成分割檢視模式,一邊是 [介面編輯器],另一邊則是 [程式碼編輯器]

  3. 請注意,Xcode 已在程式代碼編輯器自動挑選MainWindowController.m 檔案,不正確。 如果您記得從我們討論的輸出和動作為何,我們需要 選取MainWindow.h

  4. 在程式 代碼編輯器 頂端, 按兩下 [自動連結 ],然後選取 MainWindow.h 檔案:

    選取正確的 .h 檔案

  5. Xcode 現在應該已選取正確的檔案:

    選取正確的檔案

  6. 最後一個步驟很重要 ! 如果您沒有選取正確的檔案,您將無法建立輸出和動作,否則它們會在 C# 中公開至錯誤的類別!

  7. 在 [ 介面編輯器] 中,按住 鍵盤上的 [控制 ] 鍵,然後按下上方建立的標籤,並拖曳到程式碼正下方 @interface MainWindow : NSWindow { } 的程式代碼編輯器上:

    拖曳以建立新的輸出

  8. 隨即顯示對話方塊。 將 連線 設定為輸出,然後針對 [名稱] 輸入 ClickedLabel

    設定輸出屬性

  9. 按鍵 [連線] 按鈕以建立輸出:

    已完成的輸出

  10. 儲存對檔案所做的變更。

新增動作

接下來,讓我們看看如何建立動作,將使用者與UI元素的互動公開至您的C# 程式代碼。

執行下列操作:

  1. 請確定我們仍在小幫手編輯器中,而且程式代碼編輯器會顯示MainWindow.h 檔案。

  2. 在 [ 介面編輯器] 中,按住 鍵盤上的 [控件 ] 鍵,然後按下上方所建立的按鈕,並拖曳到程序代碼正下方 @property (assign) IBOutlet NSTextField *ClickedLabel; 的程式代碼編輯器上:

    拖曳以建立動作

  3. 連線 ion 型態變更為動作:

    選取動作類型

  4. 輸入 ClickedButton 作為名稱

    設定動作

  5. 按兩下 [連線] 按鈕以建立動作:

    已完成的動作

  6. 儲存對檔案所做的變更。

使用使用者介面連線並公開至 C# 程式代碼,切換回 Visual Studio for Mac,並讓它從 Xcode 和 Interface Builder 同步處理變更。

撰寫程序代碼

建立使用者介面,並透過輸出和動作公開至程序代碼的 UI 元素之後,您就可以撰寫程式代碼,讓您的程式能夠上線。 例如,在 Solution Pad按兩下檔案,以開啟MainWindow.cs檔案以進行編輯:

MainWindow.cs檔案

並將下列程式代碼新增至 MainWindow 類別,以使用您在上面建立的範例輸出:

private int numberOfTimesClicked = 0;
...

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Set the initial value for the label
    ClickedLabel.StringValue = "Button has not been clicked yet.";
}

請注意, NSLabel 當您在 Xcode 中建立其輸出時,會透過您在 Xcode 中指派的直接名稱,在 C# 中存取 ,在此案例中稱為 ClickedLabel。 您可以使用任何一般 C# 類別的相同方式,存取公開物件的任何方法或屬性。

重要

您需要使用 AwakeFromNib,而不是另一個方法,例如 Initialize,因為AwakeFromNib會在OS從 .xib 檔案載入並具現化使用者介面之後呼叫。 如果您在 .xib 檔案完全載入並具現化之前嘗試存取標籤件,您會收到 NullReferenceException 錯誤,因為尚未建立標籤控制件。

接下來,將下列部分類別新增至 MainWindow 類別:

partial void ClickedButton (Foundation.NSObject sender) {

    // Update counter and label
    ClickedLabel.StringValue = string.Format("The button has been clicked {0} time{1}.",++numberOfTimesClicked, (numberOfTimesClicked < 2) ? "" : "s");
}

此程式代碼會附加至您在 Xcode 和 Interface Builder 中建立的動作,而且會在使用者按兩下按鈕時呼叫。

某些UI元素會自動內建動作,例如預設功能表欄中的專案,例如 [開啟... ] 功能表項 (openDocument:)。 在 Solution Pad 中,按兩下 AppDelegate.cs 檔案以開啟檔案以進行編輯,並在方法下方 DidFinishLaunching 新增下列程式碼:

[Export ("openDocument:")]
void OpenDialog (NSObject sender)
{
    var dlg = NSOpenPanel.OpenPanel;
    dlg.CanChooseFiles = false;
    dlg.CanChooseDirectories = true;

    if (dlg.RunModal () == 1) {
        var alert = new NSAlert () {
            AlertStyle = NSAlertStyle.Informational,
            InformativeText = "At this point we should do something with the folder that the user just selected in the Open File Dialog box...",
            MessageText = "Folder Selected"
        };
        alert.RunModal ();
    }
}

這裡的索引鍵行是 [Export ("openDocument:")],它會指出 NSMenuAppDelegate有一個回應openDocument:動作的方法void OpenDialog (NSObject sender)

如需使用功能表的詳細資訊,請參閱功能表檔。

與 Xcode 同步處理變更

當您從 Xcode 切換回 Visual Studio for Mac 時,您在 Xcode 中所做的任何變更都會自動與您的 Xamarin.Mac 專案同步處理。

如果您在 Solution Pad選取MainWindow.designer.cs,您將能夠在 C# 程式代碼中查看我們的輸出和動作如何連線:

與 Xcode 同步處理變更

請注意MainWindow.designer.cs檔案中的兩個定義:

[Outlet]
AppKit.NSTextField ClickedLabel { get; set; }

[Action ("ClickedButton:")]
partial void ClickedButton (Foundation.NSObject sender);

在 Xcode 中 ,與 MainWindow.h 檔案中的定義對齊:

@property (assign) IBOutlet NSTextField *ClickedLabel;
- (IBAction)ClickedButton:(id)sender;

如您所見,Visual Studio for Mac 會接聽 .h 檔案的變更,然後自動同步處理個別 .designer.cs 檔案中的這些變更,以將其公開給您的應用程式。 您也可以注意到 MainWindow.designer.cs 是部分類別,因此Visual Studio for Mac 不需要修改 MainWindow.cs ,這會覆寫我們對類別所做的任何變更。

您通常永遠不需要自行開啟 MainWindow.designer.cs ,它只針對教育目的在這裡呈現。

重要

在大部分情況下,Visual Studio for Mac 會自動看到 Xcode 中所做的任何變更,並將其同步處理至您的 Xamarin.Mac 專案。 在關閉的情況下,同步處理不會自動發生,請切換回 Xcode,然後再次回到 Visual Studio for Mac。 這通常會啟動同步處理週期。

將新視窗新增至專案

除了主文檔視窗之外,Xamarin.Mac 應用程式可能需要向用戶顯示其他類型的視窗,例如 [喜好設定] 或 [偵測器面板]。 將新的 Window 新增至專案時,您應該一律使用 Cocoa Window with Controller 選項,因為這樣會使從 .xib 檔案載入 Window 的程式變得更容易。

若要新增視窗,請執行下列動作:

  1. 在 Solution Pad 中,以滑鼠右鍵按兩下專案,然後選取 [新增>檔案]。。

  2. 在 [新增檔案] 對話框中,選取具有控制器的 Xamarin.Mac>Cocoa Window:

    新增視窗控制器

  3. 輸入 PreferencesWindow 作為 [名稱],然後按一下 [新增] 按鈕。

  4. 按兩下 PreferencesWindow.xib 檔案,以在介面產生器中開啟它以進行編輯:

    在 Xcode 中編輯視窗

  5. 設計介面:

    設計視窗配置

  6. 儲存變更並返回 Visual Studio for Mac 以與 Xcode 同步。

將下列程式代碼新增至 AppDelegate.cs 以顯示您的新視窗:

[Export("applicationPreferences:")]
void ShowPreferences (NSObject sender)
{
    var preferences = new PreferencesWindowController ();
    preferences.Window.MakeKeyAndOrderFront (this);
}

var preferences = new PreferencesWindowController (); 行會建立視窗控制器的新實例,以從 .xib 檔案載入 Window 並擴充它。 這 preferences.Window.MakeKeyAndOrderFront (this); 一行會向用戶顯示新的視窗。

如果您執行程式碼並從 [應用程式] 選單中選取 [喜好設定...],則會顯示視窗:

此螢幕快照顯示 [應用程式功能表] 中顯示的 [喜好設定] 視窗。

如需在 Xamarin.Mac 應用程式中使用 Windows 的詳細資訊,請參閱我們的 Windows 檔。

將新檢視新增至專案

有時候,將窗口的設計細分成數個更容易管理的 .xib 檔案。 例如,就像在 [喜好設定視窗] 中選取工具列專案或交換內容以回應 [來源清單] 選取專案時切換主視窗的內容一樣。

將新的檢視新增至專案時,您應該一律使用 Cocoa View with Controller 選項,因為這樣會使從 .xib 檔案載入 View 的程式變得更容易。

若要新增檢視,請執行下列動作:

  1. 在 Solution Pad 中,以滑鼠右鍵按兩下專案,然後選取 [新增>檔案]。。

  2. 在 [新增檔案] 對話框中,選取 [具有控制器的 Xamarin.Mac>Cocoa 檢視]:

    新增檢視

  3. 輸入 SubviewTable 作為 [名稱],然後按一下 [新增] 按鈕。

  4. 按兩下 SubviewTable.xib 檔案,以開啟它以在介面產生器及設計使用者介面中編輯:

    在 Xcode 中設計新檢視

  5. 連接任何必要的動作和出口。

  6. 儲存變更並返回 Visual Studio for Mac 以與 Xcode 同步。

接下來, 編輯SubviewTable.cs ,並將下列程式代碼新增至 AwakeFromNib 檔案,以在載入新的檢視時填入新的檢視:

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Create the Product Table Data Source and populate it
    var DataSource = new ProductTableDataSource ();
    DataSource.Products.Add (new Product ("Xamarin.iOS", "Allows you to develop native iOS Applications in C#"));
    DataSource.Products.Add (new Product ("Xamarin.Android", "Allows you to develop native Android Applications in C#"));
    DataSource.Products.Add (new Product ("Xamarin.Mac", "Allows you to develop Mac native Applications in C#"));
    DataSource.Sort ("Title", true);

    // Populate the Product Table
    ProductTable.DataSource = DataSource;
    ProductTable.Delegate = new ProductTableDelegate (DataSource);

    // Auto select the first row
    ProductTable.SelectRow (0, false);
}

將列舉新增至專案,以追蹤目前正在顯示的檢視。 例如, SubviewType.cs

public enum SubviewType
{
    None,
    TableView,
    OutlineView,
    ImageView
}

編輯將取用檢視並顯示視窗的 .xib 檔案。 新增自定義檢視,此檢視會在 C# 程式代碼載入記憶體後作為檢視的容器,並將其公開至稱為ViewContainer的輸出:

建立必要的輸出

儲存變更並返回 Visual Studio for Mac 以與 Xcode 同步。

接下來,編輯即將顯示新檢視的 Window .cs 檔案(例如 ,MainWindow.cs),並新增下列程式代碼:

private SubviewType ViewType = SubviewType.None;
private NSViewController SubviewController = null;
private NSView Subview = null;
...

private void DisplaySubview(NSViewController controller, SubviewType type) {

    // Is this view already displayed?
    if (ViewType == type) return;

    // Is there a view already being displayed?
    if (Subview != null) {
        // Yes, remove it from the view
        Subview.RemoveFromSuperview ();

        // Release memory
        Subview = null;
        SubviewController = null;
    }

    // Save values
    ViewType = type;
    SubviewController = controller;
    Subview = controller.View;

    // Define frame and display
    Subview.Frame = new CGRect (0, 0, ViewContainer.Frame.Width, ViewContainer.Frame.Height);
    ViewContainer.AddSubview (Subview);
}

當我們需要在視窗的容器中顯示從 .xib 檔案載入的新檢視時( 上面新增的自定義檢視 ),此程式碼會處理移除任何現有的檢視,並將它交換給新的檢視。 它看起來您已經顯示檢視,如果是,它會從畫面中移除它。 接下來,它會接受已傳入的檢視(從檢視控制器載入時),調整其大小以符合內容區域,並將其新增至內容以供顯示。

若要顯示新的檢視,請使用下列程式代碼:

DisplaySubview(new SubviewTableController(), SubviewType.TableView);

這會為要顯示的新檢視建立檢視控制器的新實例、設定其類型(如新增至專案的列舉所指定),並使用 DisplaySubview 加入至 Window 類別的方法實際顯示檢視。 例如:

此螢幕快照顯示 [使用影像] 視窗中選取的 [資料表檢視]。

如需在 Xamarin.Mac 應用程式中使用 Windows 的詳細資訊,請參閱我們的 Windows對話框 檔。

摘要

本文已詳細探討在 Xamarin.Mac 應用程式中使用 .xib 檔案。 我們看到了 .xib 檔案的不同類型和用法來建立應用程式的使用者介面、如何在 Xcode 的 Interface Builder 中建立和維護 .xib 檔案,以及如何在 C# 程式代碼中使用 .xib 檔案。