[Xamarin.Mac] ウインドウを表示してみました

2020.11.12

1 はじめに

CX事業本部の平内(SIN)です。

Xamarin.Macを使用すると、C#でネイティブなMacのアプリが作成可能です。 ここでは、私自身がXamarin.Macに入門して学習した事項を覚書として書かせて頂いています。

今回は、別のウインドウを表示してみました。

2 ウインドウ作成

新しくウインドウを作成するには、ストーリーボードでView Controllerを配置します。

サイズ調整や表示位置は、プロパティの設定で行えます。

とりあえず、メインとなるウインドウに配置したボタンからsegueで繋ぎます。

これで、ボタンを押して別ウインドウを表示する事ができます。

3 Segueの種類

Segueのkindを変更する事で、ウインドウの表示方法が変わります。

(1) Modal

アクセスできるのは、新しく表示されたウインドウのみになります。

(2) Show

Modalと違い、別のウインドウへのアクセス可能であるため、ボタンを押すごとに新しくウインドウが表示されます。

(3) Sheet

(4) Popover

Popoverは、別途設定で表示方法が設定可能です。

4 カスタムクラス

ウインドウのクラス指定で、名前をつける事で、C#からアクセス可能になります。

名前を付けると、XCode上でクラスが生成されるのと同時に、Xamarin.Macでもクラスが追加されていることを確認できます。

カスタムクラスも、コントロールのOutlookやActionを関連付けてC#からアクセスします。

ウインドウ(自身)を閉じるコード例です。

namespace Sample003 {
    public partial class SampleView : NSViewController {
        public SampleView(IntPtr handle) : base(handle) {
        }

        partial void onClickButton(NSObject sender) {
            DismissController(this); // 自身を閉じる
        }
    }
}

5 遷移時の相互アクセス

PrepareForSegueをoverrideすることで、遷移時に遷移先のViewにアクセス可能です。遷移先で公開されたプロパティにアクセスすることで、データの受け渡しなどが可能です。(この時点では、新しいビューは表示されていないので、コントロールを直接操作することはできません。)

<br />[Export("prepareForSegue:sender:")]
public void PrepareForSegue(NSStoryboardSegue segue, NSObject sender) {
    var sampleView = segue.DestinationController as SampleView;

}

モーダルなウインドウを表示した場合、「それが閉じられた際のイベントを処理したい」というような要求はあると思います。 この場合の実装の一例は、以下のようになります。

  • 親となるウインドウで、閉じた際に実行したいメソッド定義する
public partial class ViewController : NSViewController {

    public void OnClose() {

    }
}
  • 子ウインドウ側では、PresentingViewControllerで親にアクセスして、定義したメソッドをコールする
public partial class SampleView : NSViewController {
    partial void onClickButton(NSObject sender) {
        var parentVC = this.PresentingViewController as ViewController;
        parentVC.OnClose(); // 親ウインドウのメソッドを呼び出す
        DismissController(this); // 自身を閉じる
    }
}

6 最後に

今回は、ウインドウの表示について確認してみました。

ウインドウの生成や遷移は、コードで書くのか、ストーリーボードで書くのか悩ましい問題があります。また、その要領も多数存在します。

個人の趣味や、考え方にもよると思いますが、少し大きなプログラムになるなら、どこで処理されているか混乱しないよう、できるだけ整理して実装することが重要だと思います。