Xamarin.Mac の .xib ファイル

この記事では、Xcode の Interface Builder で作成された .xib ファイルを使用して、Xamarin.Mac アプリケーションのユーザー インターフェイスを作成してメイン含める方法について説明します。

Note

Xamarin.Mac アプリのユーザー インターフェイスを作成するには、ストーリーボードを使用することをお勧めします。 このドキュメントは、歴史的な理由と、以前の Xamarin.Mac プロジェクトを操作するために残されています。 詳細については、ストーリーボードの概要に関するドキュメントを参照してください。

概要

Xamarin.Mac アプリケーションで C# と .NET を使用する場合は、開発者が作業しているのと Xcode と同じユーザー インターフェイス要素とツールにObjective-Cアクセスできます。 Xamarin.Mac は Xcode と直接統合されるため、Xcode の Interface Builder を使用して、ユーザー インターフェイスを作成してメインできます (または必要に応じて、C# コードで直接作成することもできます)。

.xib ファイルは、Xcode の Interface Builder でグラフィカルに作成およびメイン含まれるアプリケーションのユーザー インターフェイス (メニュー、Windows、ビュー、ラベル、テキスト フィールドなど) の要素を定義するために macOS によって使用されます。

An example of the running app

この記事では、Xamarin.Mac アプリケーションでの .xib ファイルの操作の基本について説明します。 この記事で使用する 主要な概念と手法について説明しているため、最初に Hello, Mac の記事を読むことを強くお勧めします。

Xamarin.Mac Internals ドキュメントの「C# クラス/メソッドを Xamarin.Mac Internals のセクションにObjective-C公開する」も参照してください。C# クラスObjective-Cをオブジェクトと UI 要素に結び付けるために使用される属性についてもExport説明Registerしています。

Xcode と Interface Builder の概要

Xcode の一部として、Apple は Interface Builder というツールを作成しました。これにより、デザイナーでユーザー インターフェイスを視覚的に作成できます。 Xamarin.Mac は Interface Builder と Fluently に統合されているため、ユーザーと同じツール Objective-C を使用して UI を作成できます。

Xcode のコンポーネント

Visual Studio for Mac から Xcode で .xib ファイルを開くと、左側にプロジェクト ナビゲーター、中央にインターフェイス階層インターフェイス エディター右側に [プロパティとユーティリティ] セクションが表示されます。

The components of the Xcode UI

これらの Xcode セクションの機能と、それらを使用して Xamarin.Mac アプリケーションのインターフェイスを作成する方法を見てみましょう。

プロジェクト ナビゲーション

Xcode で編集用の .xib ファイルを開くと、Visual Studio for Mac によって Xcode プロジェクト ファイルがバックグラウンドで作成され、自身と Xcode の間の変更が伝達されます。 後で Xcode から Visual Studio for Mac に切り替えると、このプロジェクトに加えられた変更は、Visual Studio for Mac によって Xamarin.Mac プロジェクトと同期されます。

[ プロジェクト ナビゲーション ] セクションでは、この shim Xcode プロジェクトを構成するすべてのファイル間を移動できます。 通常、この一覧の .xib ファイル (MainMenu.xib、MainWindow.xib など) にのみ関心があります。

インターフェイス階層

[インターフェイス階層] セクションでは、プレースホルダーやメイン ウィンドウなど、ユーザー インターフェイスのいくつかの主要なプロパティに簡単にアクセスできます。 また、このセクションを使用して、ユーザー インターフェイスを構成する個々の要素 (ビュー) にアクセスし、階層内でドラッグして入れ子になる方法を調整することもできます。

インターフェイス エディター

[ インターフェイス エディター] セクションには、ユーザー インターフェイスをグラフィカルにレイアウトする画面が表示されます。 [プロパティ] セクションの [ライブラリ] セクションから要素をドラッグして、デザインを作成します。 ユーザー インターフェイス要素 (ビュー) をデザイン サーフェイスに追加すると、インターフェイス エディターに表示される順序で [インターフェイス階層] セクションに追加されます。

プロパティとユーティリティ

[プロパティとユーティリティ] セクションは、使用する 2 つのメイン セクション、プロパティ (インスペクターとも呼ばれます) とライブラリ分かれています。

The Property Inspector

最初は、このセクションはほとんど空ですが、[インターフェイス エディター] または [インターフェイス階層] で要素を選択すると、[プロパティ] セクションに、調整できる特定の要素とプロパティに関する情報が入力されます。

プロパティ セクションには、次の図に示すように 8 つの異なるインスペクター タブがあります。

An overview of all Inspectors

左から順に次のタブがあります。

  • ファイル インスペクター – ファイル インスペクターは編集中の Xib ファイルの場所やファイル名などのファイル情報を示します。
  • クイック ヘルプ – クイック ヘルプでは、Xcode での選択内容に基づいたヘルプが表示されます。
  • ID インスペクター – ID インスペクターでは、選択したコントロールまたはビューに関する情報が表示されます。
  • Attributes Inspector – Attributes Inspector を使用すると、選択したコントロール/ビューのさまざまな属性をカスタマイズできます。
  • Size Inspector – Size Inspector を使用すると、選択したコントロール/ビューのサイズとサイズ変更の動作を制御できます。
  • Connections Inspector – Connections Inspector には、選択したコントロールのコンセントとアクションの接続が表示されます。 アウトレットとアクションをすぐに確認します。
  • Bindings Inspector – Bindings Inspector を使用すると、コントロールの値がデータ モデルに自動的にバインドされるようにコントロールを構成できます。
  • 効果の表示インスペクター – ビュー効果インスペクターを使用すると、アニメーションなどのコントロールに対する効果を指定できます。

[ライブラリ] セクションでは、デザイナーに配置するコントロールとオブジェクトを見つけて、ユーザー インターフェイスをグラフィカルに構築できます。

An example of the Library Inspector

Xcode IDE とインターフェイス ビルダーについて理解したので、それを使用してユーザー インターフェイスを作成する方法を見てみましょう。

Xcode でのウィンドウの作成とメイン

Xamarin.Mac アプリのユーザー インターフェイスを作成するための推奨される方法は、ストーリーボード (ストーリーボードの概要に関するドキュメントを参照してください) であり、その結果、Xamarin.Mac で開始された新しいプロジェクトでは、既定でストーリーボードが使用されます。

.xib ベースの UI の使用に切り替えるには、次の操作を行います。

  1. Visual Studio for Mac を開き、新しい Xamarin.Mac プロジェクトを開始します。

  2. Solution Pad でプロジェクトを右クリックし、[新しいファイルの追加>]を選択します。

  3. Mac>Windows コントローラーを選択します。

    Adding a new Window Controller

  4. 名前を入力MainWindowし、[新規] ボタンをクリックします。

    Adding a new Main Window

  5. プロジェクトをもう一度右クリックし、[新しいファイルの追加>...] を選択します。

  6. Mac>のメイン メニューを選択します。

    Adding a new Main Menu

  7. 名前MainMenuはそのままにして、[新規] ボタンをクリックします。

  8. Solution Pad で Main.storyboard ファイルを選択し、右クリックして [削除] を選択します

    Selecting the main storyboard

  9. [削除] ダイアログ ボックスで、[削除] ボタンをクリックします。

    Confirming the deletion

  10. Solution Pad で Info.plist ファイルをダブルクリックして、編集用に開きます。

  11. メイン インターフェイスドロップダウンから選択MainMenuします。

    Setting the main menu

  12. Solution Pad で MainMenu.xib ファイルをダブルクリックして、Xcode のインターフェイス ビルダーで編集するために開きます。

  13. ライブラリインスペクターで、検索フィールドに「」と入力objectし、新しいオブジェクトをデザイン画面にドラッグします。

    Editing the main menu

  14. Identity Inspector で、クラスに次のように入力AppDelegateします。

    Selecting the App Delegate

  15. インターフェイス階層からファイルの所有者選択し、接続インスペクター切り替えて、デリゲートからプロジェクトに追加したオブジェクトAppDelegate行をドラッグします。

    Connecting the App Delegate

  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 ファイルをダブルクリックします。

Selecting the MainWindow.xib file

これにより、Xcode のインターフェイス ビルダーでウィンドウ デザインが開きます。

Editing the MainWindow.xib

標準ウィンドウ ワークフロー

Xamarin.Mac アプリケーションで作成して操作するウィンドウの場合、プロセスは基本的に同じです。

  1. プロジェクトに自動的に追加される既定ではない新しいウィンドウの場合は、新しいウィンドウ定義をプロジェクトに追加します。
  2. .xib ファイルをダブルクリックして、Xcode のインターフェイス ビルダーで編集用のウィンドウ デザインを開きます。
  3. [属性インスペクター] と [サイズ インスペクター]で必要なウィンドウ プロパティを設定します。
  4. インターフェイスを構築するために必要なコントロールをドラッグし、[属性インスペクター] で構成します。
  5. サイズインスペクター使用して、UI 要素のサイズ変更を処理します。
  6. アウトレットとアクションを使用して、ウィンドウの UI 要素を C# コードに公開します。
  7. 変更を保存し、Visual Studio for Mac に戻って Xcode と同期します。

ウィンドウ レイアウトの設計

Interface ビルダーでユーザー インターフェイスをレイアウトするプロセスは、追加するすべての要素で基本的に同じです。

  1. ライブラリインスペクターで目的のコントロールを見つけて、インターフェイスエディタドラッグして配置します。
  2. 属性インスペクターで必要なウィンドウ プロパティを設定します。
  3. サイズインスペクター使用して、UI 要素のサイズ変更を処理します。
  4. カスタム クラスを使用している場合は、Identity Inspector で設定します
  5. アウトレットとアクションを使用して、UI 要素を C# コードに公開します。
  6. 変更を保存し、Visual Studio for Mac に戻って Xcode と同期します。

例:

  1. Xcode で、ライブラリ セクションからボタンをドラッグします。

    Selecting a button from the Library

  2. インターフェイス エディターのウィンドウにボタンをドロップします

    Adding a button to the window

  3. 属性インスペクターTitle プロパティをクリックし、ボタンのタイトルを「Click Me」に変更します。

    Setting the button attributes

  4. ライブラリ セクションからラベルをドラッグします。

    Selecting a label in the Library

  5. Interface Editor のボタンの横にあるウィンドウにラベルをドラッグします。

    Adding a label to the window

  6. ラベルの右ハンドルをつかみ、ウィンドウの端に近づくまでドラッグします。

    Resizing the label

  7. インターフェイス エディターでラベルが選択された状態で、サイズ インスペクター切り替えます。

    Selecting the Size Inspector

  8. [自動サイズ設定] ボックスで、右側の赤い角かっこをクリックし、中央の赤い矢印をクリックします。

    Editing the Autosizing properties

  9. これにより、実行中のアプリケーションでウィンドウのサイズが変更されると、ラベルが拡大および縮小されます。 [自動サイズ設定ボックス] ボックスの上部と左側の赤い角かっこは、指定された X と Y の位置にラベルが貼り付けられることを示します。

  10. 変更をユーザー インターフェイスに保存する

コントロールのサイズを変更して移動する際に、インターフェイス ビルダーが OS X ヒューマン インターフェイス ガイドライン基づく便利なスナップ ヒントを提供していることに気付いたはずです。 これらのガイドラインは、Mac ユーザーにとって使い慣れた外観を持つ高品質のアプリケーションを作成するのに役立ちます。

[インターフェイス階層] セクションを見ると、ユーザー インターフェイスを構成する要素のレイアウトと階層がどのように表示されているかに注目してください。

Selecting an element in the Interface Hierarchy

ここから、編集する項目を選択するか、必要に応じてドラッグして UI 要素を並べ替えることができます。 たとえば、UI 要素が別の要素で覆われている場合は、一覧の一番下にドラッグして、ウィンドウの最上位の項目にすることができます。

Xamarin.Mac アプリケーションでの Windows の操作の詳細については、Windows のドキュメントを参照してください。

UI 要素を C# コードに公開する

Interface Builder でユーザー インターフェイスの外観をレイアウトしたら、UI の要素を公開して、C# コードからアクセスできるようにする必要があります。 これを行うには、アクションとアウトレットを使用します。

カスタム メイン ウィンドウ コントローラーの設定

アウトレットとアクションを作成して UI 要素を C# コードに公開できるようにするには、Xamarin.Mac アプリでカスタム ウィンドウ コントローラーを使用する必要があります。

次の操作を行います。

  1. Xcode のインターフェイス ビルダーでアプリのストーリーボードを開きます。

  2. デザイン サーフェイスで選択 NSWindowController します。

  3. Identity Inspector ビューに切り替え、クラス名として入力WindowControllerします

    Editing the class name

  4. 変更内容を保存し、Visual Studio for Mac に戻って同期します。

  5. WindowController.cs ファイルが Visual Studio for Mac の Solution Padプロジェクトに追加されます。

    The new class name in Visual Studio for Mac

  6. Xcode のインターフェイス ビルダーでストーリーボードを再度開きます。

  7. WindowController.h ファイルを使用できます。

    The matching .h file in Xcode

アウトレットとアクション

では、アウトレットとアクションとは何でしょうか。 従来の .NET ユーザー インターフェイス プログラミングでは、ユーザー インターフェイスのコントロールは追加時にプロパティとして自動的に公開されます。 Mac では事情が異なり、ビューにコントロールを追加しただけでは、コントロールはコードにアクセスできません。 開発者は、UI 要素を明示的にコードに公開する必要があります。 これを行うために、Apple には次の 2 つのオプションがあります。

  • Outlet – Outlet はプロパティに似ています。 コントロールを Outlet に接続すると、プロパティを介してコードに公開されるため、イベント ハンドラーのアタッチ、メソッドの呼び出しなどを行うことができます。
  • アクション – アクションは WPF のコマンド パターンに似ています。 たとえば、ボタンクリックなど、コントロールに対してアクションが実行されると、コントロールはコード内のメソッドを自動的に呼び出します。 多くのコントロールを同じアクションに結び付けることができるため、アクションは強力で便利です。

Xcode では、コントロールドラッグを使用して、アウトレットとアクションがコードに直接追加されます。 具体的には、アウトレットまたはアクションを作成するには、コンセントまたはアクションを追加するコントロール要素を選択し、キーボードの Control ボタンを押したまま、そのコントロールをコードに直接ドラッグします。

Xamarin.Mac 開発者の場合、これは、アウトレットまたはアクションを Objective-C 作成する C# ファイルに対応するスタブ ファイルにドラッグすることを意味します。 Visual Studio for Mac では、インターフェイス ビルダーを使用するために生成された shim Xcode プロジェクトの一部として MainWindow.h という名前のファイルが作成されました。

An example of a .h file in Xcode

このスタブ .h ファイルは、新規作成NSWindow時に Xamarin.Mac プロジェクトに自動的に追加されるMainWindow.designer.csをミラーします。 このファイルは、Interface Builder によって行われた変更を同期するために使用され、UI 要素が C# コードに公開されるようにアウトレットとアクションを作成します。

コンセントの追加

アウトレットとアクションとは何かについての基本的な理解を得て、C# コードに UI 要素を公開するアウトレットの作成を見てみましょう。

次の操作を行います。

  1. Xcode の画面の右上の端にある二連の輪のボタンをクリックして、アシスタント エディターを開きます。

    Selecting the Assistant Editor

  2. Xcode が分割ビュー モードに切り替わり、一方の側にインターフェイス エディター、もう一方の側にコード エディターが表示されます。

  3. Xcode がコード エディターで MainWindowController.m ファイルを自動的に選択していることに注意してください。これは正しくありません。 上記のアウトレットとアクションに関する説明を覚えている場合は、MainWindow.h を選択する必要があります。

  4. コード エディターの上部にある自動リンククリックし、MainWindow.h ファイルを選択します。

    Selecting the correct .h file

  5. Xcode で正しいファイルが選択されます。

    The correct file selected

  6. 最後のステップは非常に重要です! 正しいファイルが選択されていない場合は、アウトレットとアクションを作成できないか、C# で間違ったクラスに公開されます。

  7. インターフェイス エディターで、キーボードの Control キーを押しながら、上で作成したラベルをコードのすぐ下@interface MainWindow : NSWindow { }のコード エディターにクリックしてドラッグします。

    Dragging to create a new Outlet

  8. ダイアログ ボックスが表示されます。 [接続] をアウトレットに設定したまま、[名前] を入力ClickedLabelします

    Setting the Outlet properties

  9. [接続] ボタンをクリックして、コンセントを作成します。

    The completed Outlet

  10. 変更をファイルに保存します。

アクションの追加

次に、UI 要素とのユーザー操作を C# コードに公開するアクションを作成する方法を見てみましょう。

次の操作を行います。

  1. アシスタント エディターにまだ存在し、MainWindow.h ファイルがコード エディターに表示されていることを確認します

  2. インターフェイス エディターで、キーボードの Control キーを押しながら、上で作成したボタンをクリックしてコードのすぐ下のコード エディターに@property (assign) IBOutlet NSTextField *ClickedLabel;ドラッグします。

    Dragging to create an Action

  3. 接続の種類をアクションに変更します。

    Select an Action type

  4. [名前] に「ClickedButton」を入力します。

    Configuring the Action

  5. [接続] ボタンをクリックしてアクションを作成します。

    The completed Action

  6. 変更をファイルに保存します。

ユーザー インターフェイスをワイヤードアップして C# コードに公開したら、Visual Studio for Mac に戻り、Xcode と Interface Builder からの変更を同期させます。

コードの記述

ユーザー インターフェイスが作成され、その UI 要素がアウトレットやアクションを介してコードに公開されたので、プログラムを動作させるコードを記述する準備が整います。 たとえば、編集用のMainWindow.cs ファイルを Solution Padダブルクリックして開きます。

The MainWindow.cs file

次のコードをクラスに追加して 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.";
}

Xcode でアウトレットを NSLabel 作成したときに Xcode で割り当てた直接名によって C# でアクセスされることに注意してください。この場合は呼び出されます ClickedLabel。 通常の C# クラスと同じように、公開オブジェクトの任意のメソッドまたはプロパティにアクセスできます。

重要

OS が読み込まれ、.xib ファイルからユーザー インターフェイスをインスタンス化した後に呼び出されるためAwakeFromNib、別Initializeのメソッドではなく 、使用する必要AwakeFromNibがあります。 .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:")]AppDelegate にアクションに応答openDocument:するメソッドvoid OpenDialog (NSObject sender)があることを示NSMenuしています。

メニューの操作の詳細については、メニューのドキュメントを参照してください。

Xcode との変更の同期

Xcode から Visual Studio for Mac に戻ると、Xcode で行った変更はすべて Xamarin.Mac プロジェクトと自動的に同期されます。

Solution Pad でMainWindow.designer.cs選択すると、C# コードでコンセントとアクションがどのように構成されているかを確認できます。

Synchronizing Changes with Xcode

MainWindow.designer.cs ファイル内の 2 つの定義に注目してください。

[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 アプリケーションでは、環境設定やインスペクター パネルなど、他の種類のウィンドウをユーザーに表示することが必要になる場合があります。 プロジェクトに新しいウィンドウを追加する場合は、.xib ファイルからウィンドウを 読み込むプロセスが容易になるので、Cocoa Window with Controller オプションを常に使用する必要があります。

新しいウィンドウを追加するには、次の操作を行います。

  1. Solution Pad でプロジェクトを右クリックし、[新しいファイルの追加>]を選択します

  2. [新しいファイル] ダイアログ ボックスで、コントローラー付きの Xamarin.Mac>Cocoa ウィンドウを選択します。

    Adding an new Window Controller

  3. [名前] に「PreferencesWindow」と入力し、[新規] ボタンをクリックします。

  4. PreferencesWindow.xib ファイルをダブルクリックして、インターフェイス ビルダーで編集用に開きます。

    Editing the window in Xcode

  5. インターフェイスを設計する:

    Designing the windows layout

  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); 、ユーザーに新しいウィンドウが表示されます。

コードを実行して[環境設定]を選択すると、[アプリケーション]メニューからウィンドウが表示されます。

Screenshot shows the Preferences window displayed from the Application Menu.

Xamarin.Mac アプリケーションでの Windows の操作の詳細については、Windows のドキュメントを参照してください。

プロジェクトへの新しいビューの追加

ウィンドウのデザインをいくつかのより管理しやすい .xib ファイルに分割する方が簡単な場合があります。 たとえば、[環境設定] ウィンドウでツール バー項目を選択するときにメイン ウィンドウの内容を切り替えたり、ソース リストの選択に応じてコンテンツをスワップアウトしたりします。

新しいビューをプロジェクトに追加する場合は、.xib ファイルからビューを 読み込むプロセスが容易になるので、Cocoa View with Controller オプションを常に使用する必要があります。

新しいビューを追加するには、次の操作を行います。

  1. Solution Pad でプロジェクトを右クリックし、[新しいファイルの追加>]を選択します

  2. [新しいファイル] ダイアログ ボックスで、[コントローラー付きの Xamarin.Mac>Cocoa View] を選択します。

    Adding a new view

  3. [名前] に「SubviewTable」と入力し、[新規] ボタンをクリックします。

  4. SubviewTable.xib ファイルをダブルクリックして、インターフェイス ビルダーで編集用に開き、ユーザー インターフェイスをデザインします。

    Designing the new view in 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アウトレットに公開します。

Creating the required Outlet

変更を保存し、Visual Studio for Mac に戻って Xcode と同期します。

次に、新しいビューを表示するウィンドウの.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);

これにより、表示する新しいビューのビュー コントローラーの新しいインスタンスが作成され、その型 (プロジェクトに追加された列挙型で指定) が設定され、Window のクラスに追加されたメソッドを使用 DisplaySubview してビューが実際に表示されます。 次に例を示します。

Screenshot shows Table View selected in the Working with Images window.

Xamarin.Mac アプリケーションでの Windows の操作の詳細については、Windowsダイアログのドキュメントを参照してください。

まとめ

この記事では、Xamarin.Mac アプリケーションでの .xib ファイルの操作について詳しく説明しました。 さまざまな種類の .xib ファイルを使用してアプリケーションのユーザー インターフェイスを作成し、Xcode の Interface Builder で .xib ファイルを作成してメインする方法、C# コードで .xib ファイルを操作する方法について説明しました。