RubyCocoa 入門 その2

昨日のリベンジ。

initWithCoder って何かなーと調べてみると NSCoder というプロトコル(Java でいうところの Interface みたいなもの)のメソッドで、NSObject はこれを implement していないから NSObject を継承している AppController がこれに反応できないのは当然。はて……。

昨日からちょっと気になっていたのですが、Classes のテンプレート に NSWindowController subclass というのもあって、AppController という名前なのにこっちでなくていいのかなぁと思っていたら、どうやら NSController というクラスは NSCoder を implement しているらしい。ということで、「Ruby NSWindowController subclass」を選択して同じコードを書いてみたところ、動いた!!

昨日との違いは AppController が継承するクラスだけです。

class AppController < OSX::NSWindowController
:

ちょっと好奇心から、これを OSX::NSController に変えても動きました。

class AppController < OSX::NSController
:

しかしなぜこんな違いがおきてしまったんでしょう。おそらく 10.6(Snow Leopard) だからなのでしょうけど。

  1. NSObject は NSCoder を implement していたのにそうではなくなった
  2. 実は今も NSObject は NSCoder を implement しているけど RubyCocoa のプロキシがうまくブリッジできてない
  3. Nib からオブジェクトを生成する方法が変更になった
  4. わたしの環境がとてもおかしい
  5. Interface Builder での操作を誤っていたから

[以下追記]
いくらなんでもこんな根本的な非互換を引き起す変更が入るわけないですよねー、と思って改めてやりなおしてどうやら決着をみました。原因はわたしが Interface Builder でオブジェクトを nib ファイルに追加する時に間違って「Object」ではなくて「Object Controller」を追加してしまっていたためでした。

なんでそんなミスをしたかというと、Xcode 3.2 の Interface Builder のライブラリパネルはカテゴリが BHC本に載ってるのと少し違ってまして、RHCBK には「Cocoa」>「Objects & Controllers」>「Controllers」を選択すると書いてあるのですが、実際の画面はこんな感じです。

それでまあ、「Controllers」のかわりに「Bindings」になったのかなぁと思ってこちらを選択すると…

こうなるのでうっかり「Object Controller」を追加してしまったのでした。

ちなみに「Object」を追加するためには「Cocoa」>「Objects & Controllers」を選択してあげると表示されます。

というわけで単なるうっかりミスでした。

ともあれこれで先に進めます。