Xamarin.Mac/NSApplicationのサブクラスを使う

提供: MonoBook
移動: 案内検索

MonoMacおよびXamarin.MacAppKitのNSApplicationのサブクラスを利用したい場面もあることだろう。多くの場合はNSApplicationDelegateで事足りるだろうが、稀にすべてのイベントをトラップしたい場面などではNSApplicationのサブクラスを作る必要がある。

実装1[編集]

NSApplicationのサブクラスを作る[編集]

Register属性で指定した名前は後ほどInfo.plistで利用される。凄く重要。クラス名と同じにしておくと紛らわしくないと思われる。

NSApplicationがデフォルトコンストラクタを持たない関係でサブクラスにもコンストラクタがないとコンパイルが通らないが、デバッガで追ってみた限りでは呼ばれている気配はない。そのためAwakeFromNibメソッドをオーバーライドして初期化している。これでいいのかは知らん。

    using System;
 
    using Foundation;
    using AppKit;
 
    [Register("App")]
    public class App : NSApplication
    {
        public App(IntPtr handle) : base(handle) {}
 
        public App(NSCoder coder) : base(coder) {}
 
        /// <summary>
        /// 初期化はAwakeFromNibのタイミングでいいのか?
        /// 調査中
        /// </summary>
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();
            this.Delegate = new AppDelegate();
        }
 
        /// <summary>
        /// こいつをオーバーライドすればほぼ全てのイベントが取れる
        /// </summary>
        /// <param name="theEvent">The event.</param>
        public override void SendEvent(NSEvent theEvent)
        {
            base.SendEvent(theEvent);
        }
    }

MainMenu.xibを追加する[編集]

MainMenu.xibが既にある場合はそのまま。MainMenu.xibがない場合はファイルを新規作成する。Xamarin Studioの新規作成ダイアログでは「Main Menu」という名称になっているはず。

Info.plistを設定する[編集]

Info.plistが既にある場合はそのまま。Info.plistがない場合はファイルを新規作成する。Xamarin Studioの新規作成ダイアログでは「Application Manifest」という名称になっているはず。

Info.plistを開き下部にある「ソース」タブを選択する。するとプロパティの一覧が列挙されるので以下の値を設定する。プロパティに目的の項目がない場合はリスト下部の「Add new entry」を選べば新しい行が追加される。

  • Principal class(String型)→ 前述のRegister属性で付けた名前を入力する(この例であれば「App」)
  • Main nib file name(String型)→ MainMenu

エントリポイントを書き換える[編集]

Xamarin Studioで「空のプロジェクト」を作ると初期値でこんな感じになっている。

    static class MainClass
    {
        static void Main(string[] args)
        {
            NSApplication.Init();
 
            var application = NSApplication.SharedApplication;
            application.Delegate = new AppDelegate();
            application.Run();
        }
    }


これを以下のように書き換える。なお「空のプロジェクト」ではなく「Cocoa」を選ぶと最初からこうなっている。

    using System;
    using AppKit;
 
    static class MainClass
    {
        static void Main(string[] args)
        {
            NSApplication.Init();
            NSApplication.Main(args);
        }
    }

関連項目[編集]

参考文献[編集]