亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

MonoMac超事始め

諸君、私はC#が(ry

てなわけで僕はC#が超好きです。最近Macもお気に入りです。軽いし、ヌルヌル動くし。
そして、MacアプリケーションはC#でかけます。そう、MonoMacならね(ドヤァ


というわけで、ちょいと触ってみます。噂通りのMVCモデルっぷりですので、多分WPFを触る時と同じような違和感があります。逆に一度慣れたら癖になりそうな、またまたWPF的な魅力を持っている、気がします。とはいえ、まずは一歩一歩やって行きましょう。

あ、前提としてmonoMonoDevelopは入っているものとしてますよ、念のため。最新のを入れといてくださいね。日本語化は昨日のを参考してね。

画面作成

まず、プロジェクト作成

まず、MonoMacのプロジェクトテンプレートを選択し、適当な名前をつけて作成します。ここは普通ですね。
f:id:posaunehm:20120114020826p:image
するとこんな感じでプロジェクトが作成されます。なんかワクワクしますね、なんとなく。
f:id:posaunehm:20120114021843p:image

次に、XCode Interfaceで画面作成

さて、ここでいきなり XCodeです。まぁBlend使うようなもんですよね。ちょっと違うか。
という訳で、InterfaceBuilderで開きましょう。
f:id:posaunehm:20120114022054p:image
すると、こんな感じの画面になります。とりあえず、ボタンとラベルでも追加しておきましょうか・・・
f:id:posaunehm:20120114022718p:image

それから、outletとactionを設定

こっからがMacっぽい所です。というか普通にiOSの参考書を読まないとわかんねーですよ。outletは単純にUI上のUI要素をコード側から触るためのもの。actionはまぁ、イベントですね。まず、InterfaceBuilderのViewを切り替えます。なんか右上のタキシードみたいなのを押してください。
f:id:posaunehm:20120114023302p:image
そしたら右側のカラムに謎のコードブロック(どうやらMainWindow.hらしい)が出現します。
f:id:posaunehm:20120114023553p:image
なんとなくお作法的にはController側に書くらしいので、MainWindowContoroller.hに変更しておきましょう。
f:id:posaunehm:20120114030148p:image
んで、ここにCtrlをおしながらコントロールを持って行くとoutlet/actionができます。こんな感じで。
f:id:posaunehm:20120114023837p:image
ここでは、ボタンに対してはactionを、ラベルに対してはoutletを追加しておきましょう。ボタンを押したらラベルが書き換わるようなイメージですね。例えばaction名をClick、outlet名をLabelとかにすると、コードはこんな感じになります。

@interface MainWindow : NSWindow {
    NSTextField *Label;
}
//ボタンのクリックアクション
- (IBAction)Click:(id)sender;
//ラベルのoutlet
@property (assign) IBOutlet NSTextField *Label;

@end
MonoDevelopに戻って定義したoutletとactionを使って動きを作る

はてさて、それではしばらくぶりにMonoDevelopにもどってみます。するとMainwindow.designer.csに以下のような感じで先ほど追加したactionとoutletっぽいものが追加されてます。

	[Register ("MainWindowController")]
	partial class MainWindowController
	{
		[Outlet]
		MonoMac.AppKit.NSTextField Label { get; set; }

		[Action ("Click:")]
		partial void Click (MonoMac.Foundation.NSObject sender);
	}

ただし、これをそのまま触るわけではありません。MainWindowControllerから触ることになります。
まずLabelは普通にプロパティとしてアクセスできます。それからActionで定義したClickですが、Partialメソッドになってますので、もう片方のpartialを実装してやることになります。てなわけで、MainWindowControllerに以下のようなコードを追加すると、とりあえずGUI的ハローワールドは完了です。

		partial void Click (NSObject sender)
		{
			Label.StringValue = "Thank you!";
		}
しかし、、、これで正しいの?

とりあえずばばばっと作って見ましたがこれがデザイン的に正しいのかは割と疑問だったり。なんかどちらかっていうとWPFよりMFCに似たところを感じるような形です。確かにXAMLと同じようにデザイン要素以外をデザインコードに入れるのは難しくはなっているんですが、なんかそういうことじゃない気も・・・

というわけで、細かいところはもうちょっと見ないとダメですね。