[Xamarin.Mac] アラートを表示してみました

2020.11.10

1 はじめに

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

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

GUIアプリの入門で、とりあえずのモックとしてアラートを表示する場面は、多いと思います。ということで、今回は、アラートを表示してみました。

2 とりあえず表示

配置したボタンをクリックすると、アラートを表示する簡単なコードです。

partial void onClick(NSObject sender) {
    var alert = new NSAlert() {
        AlertStyle = NSAlertStyle.Warning,
        MessageText = "アラートの要約",
        InformativeText = "アラートの詳細な説明",
        Icon = NSImage.ImageNamed(NSImageName.Caution)
    };
    alert.RunModal();
}

(1) AlertStyle

アラートのスタイルで、Warning,Informational,Criticalの3種類が指定可能です。表示上に大きな違いは無いようです。

public enum NSAlertStyle : ulong {
    Warning,
    Informational,
    Critical
}

(2) MessageText

アラートの要約(省略すると、Alertと表示されます)

(3) InformativeText

アラートの詳細説明

(4) Icon

表示するアイコン(省略すると、AlertStyleに応じたデフォルトのアイコンが表示されます)

3 その他の要素

アラートには、上記のほかにもいくつかの要素を追加できます。

Human Interface Guidelines - Alerts

(1) ボタン

デフォルトで表示されるボタン以外を設定する場合は、AddButton() メソッドで追加します。

var alert = new NSAlert() {
    // ....
};
alert.AddButton("Ok");
alert.AddButton("Cancel");
alert.RunModal();

(2) SuppressionButton

ShowsSuppressionButtonをtrueにすることで、チェックボックスを表示できます。

var alert = new NSAlert() {
    // ....
};
alert.ShowsSuppressionButton = true;
alert.SuppressionButton.Title = "チェックに関するメッセージ";
alert.RunModal();

SuppressionButtonは、NSButtonとして、Titleなどの設定が可能です。

(3) AccessoryView

AccessoryViewを使用すると、追加情報を提供できます。

var alert = new NSAlert() {
    // ....
};
var input = new NSTextField(new CGRect(0, 0, 300, 20));
alert.AccessoryView = input;
alert.RunModal();

AccessoryViewは、NSViewなので、任意のビューを指定できます。また、受け取った入力は、NSAlertとは別に、追加したビューのオブジェクトとしてアクセスします。

4 NSAlertの戻り値

NSAlertの戻り値は、nint型で1000以降の数値となります。

var alert = new NSAlert() {
    // ....
};
alert.AddButton("1000");
alert.AddButton("1001");
alert.AddButton("1002");
alert.AddButton("1003");
var result = alert.RunModal();
Console.WriteLine($"{result}");

出力ウインドウで、戻り値を確認している様子です。

5 最後に

今回は、アラートについて確認してみました。

とりあえず、「モック代わに」というような扱いで書いてしまいましたが、Appleのガイドラインでは、「警告アイコンは控えめに」「必要最小限での利用」が推奨となっています。

また、今回扱った、別ウインドウで表示されるものは、アプリ全体に関するアラートに使用し、特定のウインドウに関するのもは、ウインドウ内に表示されるalert.BeginSheet(this) を使用するようにとの記載もあります。

この辺、C#とは言え、Windowsアプリとは違うアプローチが必要だと思います。