「Xamarin.Mac/NSApplicationのサブクラスを使う」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(153.174.184.145 (トーク) による版 6178 を取り消し)
26行目: 26行目:
 
         {
 
         {
 
             base.AwakeFromNib();
 
             base.AwakeFromNib();
 +
            this.Delegate = new AppDelegate();
 
         }
 
         }
  
45行目: 46行目:
  
 
===エントリポイントを書き換える===
 
===エントリポイントを書き換える===
エントリポイントを以下のように書き換える。なおXamarin Studioで「空のプロジェクト」を作ると最初からでこんな感じになっている。
+
Xamarin Studioで「空のプロジェクト」を作ると初期値でこんな感じになっている。
 
<source lang="csharp">
 
<source lang="csharp">
 
     static class MainClass
 
     static class MainClass
60行目: 61行目:
 
</source>
 
</source>
  
「空のプロジェクト」ではなく「Cocoa」を選ぶと最初からこうなっている。
+
 
 +
これを以下のように書き換える。なお「空のプロジェクト」ではなく「Cocoa」を選ぶと最初からこうなっている。
 
<source lang="csharp">
 
<source lang="csharp">
 
     using System;
 
     using System;
74行目: 76行目:
 
     }
 
     }
 
</source>
 
</source>
 
ちなみにNSApplication.Mainはアップル公式のドキュメントによると以下のような意味らしい。nibファイルの読み込みがビックなお世話だね。
 
<source lang="objc">
 
void NSApplicationMain(int argc, char *argv[]) {
 
    [NSApplication sharedApplication];
 
    [NSBundle loadNibNamed:@"myMain" owner:NSApp];
 
    [NSApp run];
 
}
 
</source>
 
 
  
 
==関連項目==
 
==関連項目==

2015年4月20日 (月) 07:35時点における版

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);
        }
    }

Info.plistに「Principal class」を設定する

Info.plistを開き、Xamarin Studio下部の「ソース」タブを選択する。Info.plistがない場合はファイルを追加する(新規追加ダイアログでは「Application Manifest」という名称になっているはず)。

プロパティの一覧が列挙されるので、プロパティ「Principal class」に「String」型で前述のRegister属性で付けた名前を入力する(この例であれば「App」)。プロパティ「Principal class」がない場合はリスト下部の「Add new entry」を選べば新しい行が追加される。

エントリポイントを書き換える

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);
        }
    }

関連項目

参考文献