RubyCocoa 入門 その1

RubyによるMac OS Xデスクトップアプリケーション開発入門 ~Ruby×RubyCocoa/MacRuby×HotCocoa~ の前半、Xcode での RubyCocoa 開発をするところをまだ読んでいなかったので、ちょっと写経しようと思ったらなにか地雷を踏んでしまったみたいでした。

[2009-10-05 追記]AppController の継承するクラスを変更したら動くようになりました → RubyCocoa 入門 その2 - PB memo [/追記]

まずは 3章の Hello,RubyCocoa を作ってみるかと書かれてある通りにさらさらと書いて繋げて*1、ビルド&実行、しかしエラーになってしまいます。

/Users/nagachika/Documents/HelloRubyCocoa/build/Debug/HelloRubyCocoa.app/Contents/Resources/rb_main.rb:22:in `NSApplicationMain': Ruby object `#<AppController:0x22c36a class='AppController' id=0x320440>' doesn't respond to the ObjC selector `initWithCoder:', the method either doesn't exist or is private (RuntimeError)
	from /Users/nagachika/Documents/HelloRubyCocoa/build/Debug/HelloRubyCocoa.app/Contents/Resources/rb_main.rb:22

どうも AppController に initWithCoder メソッドがないからじゃないか、と思えたので AppController.rb にこんな定義を追加してみたら、ウィンドウは開くようになりました。

class AppController < OSX::NSObject
:
(略)
:
  def initWithCoder(coder)
    @text_field = ""
  end
end

けどボタンを押しても表示はされません。それはそのはずで、@text_field は本当は String じゃないはずですから。上のコードはあきらかに間違っています。けど @text_field を何かしら初期化(nil 以外で?)しておかないと今度は [NSIBObjectData iniwWithCoder:] がエラーになって画面が出ないのでしかたなく空文字列を代入しています。多分 initWithCoder は RubyCocoa で提供されるべきメソッドなのではないかと思いますが、Snow Leopard だからかも。RubyCocoa が古いのかなぁ。けど LimeChat の入れ替えの時に古い Framework は削除したはず。

残念ながら今日はここまで。

*1:GUIWidget とオブジェクトをグラフィックに繋げるのはやっぱり感動もの