共用方式為


在 Xamarin.Mac 中使用分鏡腳本

分鏡腳本會定義指定應用程式的所有UI細分成其檢視控制器的功能概觀。 在 Xcode 的介面產生器中,每個控制器都位於自己的場景中。

Xcode 介面產生器中的分鏡腳本

分鏡腳本是一個資源檔(擴展名 .storyboard為 ),會在編譯並出貨時包含在 Xamarin.Mac 應用程式的套件組合中。 若要定義應用程式的起始分鏡腳本,請編輯其 Info.plist 檔案,然後從下拉式方塊中選取 主要介面

Info.plist 編輯器

從程式代碼載入

有時候您可能需要從程式代碼載入特定的分鏡腳本,並手動建立檢視控制器。 您可以使用下列程式代碼來執行此動作:

// Get new window
var storyboard = NSStoryboard.FromName ("Main", null);
var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

// Display
controller.ShowWindow(this);

FromName 載入分鏡文本檔案,其中包含應用程式套件組合中包含的指定名稱。 會 InstantiateControllerWithIdentifier 使用指定的身分識別,建立檢視控制器的實例。 您在設計 UI 時,在 Xcode 的介面產生器中設定身分識別:

在介面產生器中設定分鏡腳本標識碼。

您可以選擇性地使用 InstantiateInitialController 方法來載入已在 Interface Builder 中指派初始控制器的檢視控制器:

設定初始控制器

其會以 分鏡腳本進入點 和上方的開啟結束箭號標示。

檢視控制器

檢視控制器會定義 Mac 應用程式內指定資訊檢視與提供該資訊的數據模型之間的關聯性。 分鏡腳本中的每個最上層場景都代表 Xamarin.Mac 應用程式程式代碼中的一個檢視控制器。

檢視控制器生命週期

已將數個新方法新增至 NSViewController 類別,以支援macOS中的分鏡腳本。 最重要的是,下列方法是使用 下列方法來回應由指定檢視控制器所控制的檢視生命週期:

  • ViewDidLoad - 從分鏡腳本檔案載入檢視時,會呼叫這個方法。
  • ViewWillAppear - 這個方法會在畫面上顯示檢視之前呼叫。
  • ViewDidAppear - 這個方法會在畫面上顯示檢視之後直接呼叫。
  • ViewWillDisappear - 這個方法會在從畫面移除檢視之前呼叫。
  • ViewDidDisappear - 這個方法會在檢視從畫面中移除之後直接呼叫。
  • UpdateViewConstraints - 當定義檢視自動版面配置位置和大小的條件約束需要更新時,就會呼叫這個方法。
  • ViewWillLayout - 這個方法會在畫面上配置此檢視的子檢視之前呼叫。
  • ViewDidLayout - 這個方法會在畫面上配置檢視子檢視之後直接呼叫。

回應者鏈結

此外,NSViewControllers現在是視窗回應程式鏈結的一部分:

回應者鏈結

因此,它們會連線接收和回應剪下、複製和貼上功能選取等事件。 此自動檢視控制器連線只會發生在macOS Sierra (10.12) 和更新版本上執行的應用程式上。

Containment

在分鏡腳本中,檢視控制器(例如分割檢視控制器和索引卷標檢視控制器)現在可以實 作內含專案,讓它們可以「包含」其他子檢視控制器:

檢視控制器內含專案的範例

子檢視控制器包含方法與屬性,可將它們系結回父檢視控制器,並處理從畫面中顯示和移除檢視。

macOS 內建的所有容器檢視控制器都有特定的配置,Apple 建議您在建立自己的自定義容器檢視控制器時遵循此配置:

檢視控制器配置

集合檢視控制器包含集合檢視專案的數位,每個數位都包含一或多個包含自己檢視的檢視控制器。

Segues

Segues 提供定義應用程式 UI 之所有場景之間的關聯性。 如果您熟悉在 iOS 的分鏡腳本中工作,您知道 iOS 的 Segues 通常會定義全螢幕檢視之間的轉換。 這與macOS不同,當Segues通常定義「內含專案」時,其中一個場景是父場景的子系。

在 macOS 中,大部分的應用程式通常會使用分割檢視和索引標籤等 UI 元素,將其檢視群組在相同的視窗中。 不同於 iOS,因為實體顯示空間有限,因此檢視必須在畫面上和關閉畫面上轉換。

簡報 Segues

鑒於macOS的內含傾向,在某些情況下 會使用簡報Segue ,例如強制回應 Windows、工作表檢視和Popovers。 macOS 提供下列內建 segue 類型:

  • 顯示 - 將 Segue 的目標顯示為非強制回應視窗。 例如,使用這種類型的 Segue 在您的應用程式中呈現另一個文檔視窗實例。
  • 強制回應 - 將 Segue 的目標呈現為強制回應視窗。 例如,使用此類型的 Segue 來呈現您應用程式的 [喜好設定視窗]。
  • 工作表 - 將 Segue 的目標呈現為附加至父視窗的工作表。 例如,使用此類型的 Segue 來呈現 Find 和 Replace Sheet。
  • Popover - 在彈出視窗中呈現 Segue 的目標。 例如,當使用者按兩下 UI 元素時,使用此 Segue 類型來呈現選項。
  • 自訂 - 使用開發人員所定義的自定義 Segue 類型來呈現 Segue 的目標。 如需詳細資訊,請參閱下方的 <建立自定義 Segue> 一節。

使用 Presentation Segues 時,您可以覆寫 PrepareForSegue 父檢視控制器的 方法來初始化和變數,並將任何數據提供給所呈現的檢視控制器。

觸發的 Segues

觸發的 Segues 可讓您指定具名 Segues (透過其 Interface Builder 中的 Identifier 屬性),並讓使用者按鍵或透過在程式代碼中呼叫 PerformSegue 方法等事件觸發:

// Display the Scene defined by the given Segue ID
PerformSegue("MyNamedSegue", this);

當您設定應用程式的 UI 時,Segue 識別元會在 Xcode 的介面產生器內定義:

輸入 Segue 名稱

在做為 Segue 來源的檢視控制器中,您應該覆寫 PrepareForSegue 方法,並在執行 Segue 之前執行任何必要的初始化,並顯示指定的檢視控制器:

public override void PrepareForSegue (NSStoryboardSegue segue, NSObject sender)
{
    base.PrepareForSegue (segue, sender);

    // Take action based on Segue ID
    switch (segue.Identifier) {
    case "MyNamedSegue":
        // Prepare for the segue to happen
        ...
        break;
    }
}

您可以選擇性地覆寫 ShouldPerformSegue 方法,並控制 Segue 是否實際透過 C# 程式代碼執行。 針對手動呈現的檢視控制器,請呼叫其 DismissController 方法,以在不再需要時將其從顯示中移除。

建立自定義 Segues

有時候,您的應用程式需要 macOS 中定義的內建 Segues 未提供 Segue 類型。 如果是這種情況,您可以在配置應用程式的UI時,建立可在 Xcode 介面產生器中指派的自訂 Segue。

例如,若要建立新的 Segue 類型,以取代視窗內目前的檢視控制器(而不是在新視窗中開啟目標場景),我們可以使用下列程式代碼:

using System;
using AppKit;
using Foundation;

namespace OnCardMac
{
    [Register("ReplaceViewSeque")]
    public class ReplaceViewSeque : NSStoryboardSegue
    {
        #region Constructors
        public ReplaceViewSeque() {

        }

        public ReplaceViewSeque (string identifier, NSObject sourceController, NSObject destinationController) : base(identifier,sourceController,destinationController) {

        }

        public ReplaceViewSeque (IntPtr handle) : base(handle) {
        }

        public ReplaceViewSeque (NSObjectFlag x) : base(x) {
        }
        #endregion

        #region Override Methods
        public override void Perform ()
        {
            // Cast the source and destination controllers
            var source = SourceController as NSViewController;
            var destination = DestinationController as NSViewController;

            // Swap the controllers
            source.View.Window.ContentViewController = destination;

            // Release memory
            source.RemoveFromParentViewController ();
        }
        #endregion

    }

}

這裡要注意的幾個事項:

  • Register我們使用 屬性將這個類別公開給 Objective-C/macOS。
  • 我們正在覆寫 Perform 方法,以實際執行自定義 Segue 的動作。
  • 我們將使用 Segue 的目標(目的地)所定義的控制器取代 Window ContentViewController 的控制器。
  • 我們會移除原始檢視控制器,以使用 RemoveFromParentViewController 方法來釋放記憶體。

若要在 Xcode 的 Interface Builder 中使用這個新的 Segue 類型,我們必須先編譯應用程式,然後切換至 Xcode,並在兩個場景之間新增 Segue。 將 Style 設定為 Custom,並將 Segue 類別設定為 ReplaceViewSegue (自訂 Segue 類別的名稱):

設定 Segue 類別

視窗控制器

視窗控制器包含並控制macOS應用程式可以建立的不同窗口類型。 針對分鏡腳本,他們具有下列功能:

  1. 他們必須提供內容檢視控制器。 這會是子窗口擁有的相同內容檢視控制器。
  2. 屬性 Storyboard 會包含視窗控制器從載入的分鏡腳本,否則 null 如果未從分鏡腳本載入。
  3. 您可以呼叫 DismissController 方法來關閉指定的 Window,並將它從檢視中移除。

如同檢視控制器,視窗控制器會實 PerformSegue作 和方法, PrepareForSegueShouldPerformSegue 並可用來做為 Segue 作業的來源。

視窗控制器負責 macOS 應用程式的下列功能:

  • 他們會管理特定的視窗。
  • 他們會管理視窗的標題列和工具列(如果有的話)。
  • 他們會管理內容檢視控制器以顯示視窗的內容。

手勢辨識器

macOS 的手勢辨識器與 iOS 中的對應項目幾乎完全相同,並允許開發人員輕鬆地將手勢(例如按鼠按鈕)新增至您 app UI 中的元素。

不過,iOS 中的手勢取決於應用程式的設計(例如使用兩根手指點選螢幕),macOS 中的大多數手勢都是由硬體決定。

藉由使用手勢辨識器,您可以大幅減少將自定義互動新增至UI中專案所需的程式代碼數量。 因為它們可以在按兩下和單鍵之間自動判斷,按兩下並拖曳事件等等。

使用分鏡腳本時,您應該使用手勢辨識器來處理使用者輸入事件,而不是覆 MouseDown 寫檢視控制器中的事件。

macOS 提供下列手勢辨識器:

  • NSClickGestureRecognizer - 註冊滑鼠向下和向上事件。
  • NSPanGestureRecognizer - 將滑鼠按鈕向下登錄、拖曳和放開事件。
  • NSPressGestureRecognizer - 登錄將滑鼠按鈕按住指定的時間量事件。
  • NSMagnificationGestureRecognizer - 從軌跡板硬體註冊放大事件。
  • NSRotationGestureRecognizer - 從軌跡板硬體註冊旋轉事件。

使用分鏡腳本參考

分鏡腳本參考可讓您採用大型、複雜的分鏡腳本設計,並將其分成較小的分鏡腳本,以從原始參考,因此移除複雜度,並讓產生的個別分鏡腳本更容易設計和維護。

此外,分鏡腳本參考可以提供 錨點 給相同分鏡腳本內的另一個場景,或不同場景上的特定場景。

參考外部分鏡腳本

若要新增外部 Storyboard 的參考,請執行下列動作:

  1. 方案總管 中,以滑鼠右鍵按兩下 [項目名稱],然後選取 [新增>檔案...>Mac>分鏡腳本。 輸入新分鏡腳本的 [名稱],然後按下 [新增] 按鈕:

    新增分鏡腳本

  2. 方案總管 中,按兩下新的分鏡腳本名稱,以開啟它以在 Xcode 的 Interface Builder 中編輯。

  3. 像平常一樣設計新分鏡腳本場景的版面配置,並儲存變更:

    設計介面

  4. 切換至您要在介面產生器中新增 參考的分鏡腳本。

  5. 分鏡文稿參考物件庫 拖曳到設計介面:

    在文檔庫中選取分鏡腳本參考

  6. 在 [ 屬性偵測器] 中,選取您在上面建立的 分鏡腳本 名稱:

    設定參考

  7. 在現有的場景上按兩下UI小工具(例如按鈕),並建立您剛才建立之 分鏡腳本參考 的新 Segue。 從快顯功能表中,選取 [ 顯示 ] 以完成 Segue:

    設定 Segue 類型

  8. 將變更儲存至分鏡腳本。

  9. 返回 Visual Studio for Mac 以同步您的變更。

當應用程式執行且使用者按下您建立 Segue 的 UI 元素時,就會顯示分鏡腳本參考中所指定外部分鏡腳本的初始視窗控制器。

參考外部分鏡腳本中的特定場景

若要將參考新增至特定的場景外部分鏡腳本(而非初始視窗控制器),請執行下列動作:

  1. 方案總管 中,按兩下外部分鏡腳本,開啟它以在 Xcode 的 Interface Builder 中編輯。

  2. 新增場景並設計其版面配置,就像平常一樣:

    在 Xcode 中設計版面配置

  3. 在身 分識別偵測器中,輸入 新場景視窗控制器的分鏡腳本標識碼

    將分鏡腳本 I D 設定為 [身分識別] 底下的 AltScene。

  4. 開啟您要在 Interface Builder 中新增 參考的分鏡腳本。

  5. 分鏡文稿參考物件庫 拖曳到設計介面:

    從文檔庫選取分鏡腳本參考

  6. 在身分識別偵測器中,選取您上面建立之場景的分鏡腳本名稱和參考標識元(分鏡腳本標識符):

    在分鏡腳本參考底下將 [參考標識符] 設定為 AltScene。

  7. 在現有的場景上按兩下UI小工具(例如按鈕),並建立您剛才建立之 分鏡腳本參考 的新 Segue。 從快顯功能表中,選取 [ 顯示 ] 以完成 Segue:

    設定 Segue 類型

  8. 將變更儲存至分鏡腳本。

  9. 返回 Visual Studio for Mac 以同步您的變更。

當應用程式執行且使用者按兩下您從中建立 Segue 的 UI 元素時,將會顯示具有分鏡腳本參考中所指定外部分鏡腳本標識碼的場景

參考相同分鏡腳本中的特定場景

若要將參考新增至相同分鏡腳本的特定場景,請執行下列動作:

  1. 方案總管 中,按兩下分鏡腳本開啟以進行編輯。

  2. 新增場景並設計其版面配置,就像平常一樣:

    在 Xcode 中編輯分鏡腳本

  3. 在身 分識別偵測器中,輸入 新場景視窗控制器的分鏡腳本標識碼

    將分鏡腳本 I D 設定為 [身分識別] 底下的 IntScene。

  4. 分鏡文稿參考工具箱 拖曳至設計介面:

    從文檔庫選取分鏡腳本參考

  5. [屬性偵測器] 中,選取 您在上面建立之場景的 [參考標識符 ][分鏡腳本標識符] :

    在分鏡腳本參考下將 [參考標識符] 設定為 IntScene。

  6. 在現有的場景上按兩下UI小工具(例如按鈕),並建立您剛才建立之 分鏡腳本參考 的新 Segue。 從快顯功能表中,選取 [ 顯示 ] 以完成 Segue:

    選取 Segue 類型

  7. 將變更儲存至分鏡腳本。

  8. 返回 Visual Studio for Mac 以同步您的變更。

當應用程式執行且使用者按兩下您從中建立 Segue 的 UI 元素時,會顯示在分鏡腳本參考中指定的相同分鏡腳本中具有指定分鏡腳本標識碼的場景。