ついにPantherが出荷されました。同時に開発環境もXcodeになりましたね。Cocoaの環境もますます充実してきて、今後がとても楽しみです。
さて、前回の続きですが、その前に第23回で説明した内容を覚えていますでしょうか。第23回では次のことを説明しました。
「NSApplicationクラスのインスタンスのdelegateが、applicationShouldOpenUntitledFile:というメソッドを実装していて、これがNOを返すと起動時に空のウィンドウを開かなくなる。」
そこで前回はInterfaceBuilderを使い、このdelegateにするためのクラスを、AppContollerという名前で生成しました。ただし、生成したと言っても単にファイルを作っただけで、まだ何も実装していません。今回は、この実装から始めます。
いつも通り、TinyView.pbprojをProjectBuilderで開いて下さい。なんでしたら、さっそくXcodeを使ってもかまいませんが、一度Xcodeで開くとProjectBuilderで開けなくなるかもしれませんので、それが困る方はコピーしてからの方が良いと思います。プロジェクトを開いたら、AppController.mを開いて、次の様にapplicationShouldOpenUntitledFile:を書き加えて下さい。
@implementation AppController - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { return NO; } @end
今回は単にNOを返すだけですから、とてもらくちんですね。
さて、これでdelegateにするためのクラスは出来たのですが、この後どうしたら良いでしょう。起動時に空のウィンドウを開かなくするためには、このクラスをインスタンス化し、それがdelegateであるとNSApplicationクラスのインスタンスに教えなければなりません。それも、起動した時に行わなければ意味がありません。ところが、起動時の処理はフレームワークが内部的に行っていますから、通常の方法ではこれに手を出せません。困りました。こんな時、とても便利な方法が、Cocoaにはあります。それは、nibファイルに組み込んでしまうという方法です。
ProjectBuilder(もしくはXcode)からMainMenu.nibをダブルクリックして開いて下さい(fig.01)(fig.02)(既に開いている場合は、この操作ではInterfaceBuilderに切り替わりませんので、直接ドックで選んで下さい)。
[fig.01] Resourcesの中のMainMenu.nib(ProjectBuilder) |
[fig.02]Resourcesの中のMainMenu.nib(Xcode) |
InterfaceBuilderが起動しますので、nibファイルウィンドウでClassesタブを選んで下さい。そして前回作成しました、AppControllerクラスを選んで下さい(fig.03)。
[fig.03]Classesの中のAppControllerを選ぶ |
選んだらClassesメニューからInstantiate AppControllerを選んで下さい(fig.04)。
[fig.04] ClassesメニューのInstantiate AppControllerを選ぶ |
するとnibファイルウィンドウの表示が、Instancesに自動的に切り替わります。見ると、AppControllerというオブジェクトが出来ているはずです(fig.05)。
[fig.05] AppControllerというオブジェクトができる |
これはAppControllerクラスがインスタンス化された状態で、nibファイルに格納されたということです。つまり、このnibファイルをロードするだけで、自動的にインスタンス化されることになります。MainMenu.nibは、アプリ起動時にロードされますから、これでAppControllerを起動時にインスタンス化できるようになりました。後は、NSApplicationのインスタンスにこれがdelegateであることを教えるだけです。実はこれもnibファイルで出来てしまいます。
nibファイルウィンドウの中にFile's Ownerがありますが、これがNSApplicationのインスタンスです。つまり、File's Ownerが、AppControllerのことをdelegateであると認識すれば良いわけです。では、これを教えてあげましょう。controlキーを押したままFile's Ownerをマウスで選択し、そのままドラッグしてAppControllerまで持っていって離してください(fig.06)。
[fig.06] controlキーを押したままマウスをドラッグ |
すると、Connectionの設定画面に切り替わったInfoウィンドウが開きます。delegateを選択して、Connectボタンを押して下さい(fig.07)。
[fig.07] delegateを接続する |
するとdelegateはAppControllerに接続され、nibファイルをロードしただけでそのアドレスがセットされるようになります。本来なら、setDelegate:メッセージを投げることにより、delegateをセットするのですが、こうすればその必用がありません。これで起動時にAppControllerクラスをインスタンス化し、それをNSApplicationクラスのインスタンスのdelegateとすることが出来ました。
この様に、nibファイルは単にウィンドウやメニューのデザインを格納しておくだけでは無い、とても強力な構造を持っており、様々な応用が効きます。
では、MainMenu.nibを保存し、ProjectBuilder(もしくはXCode)に戻ってビルドして実行してみて下さい。空のウィンドウが開かなくなっているはずです。