Cocoaでいこう! Macらしく 第25回
Yoshiki(DreamField)
この記事は、MOSAが発行するデベロッパ向けのデジタルマガジンMOSADeN 第86号(2003年10月28日発行)に掲載された記事です。2〜3ヶ月遅れで、ここに掲載して行きます。

ついに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)に戻ってビルドして実行してみて下さい。空のウィンドウが開かなくなっているはずです。

前頁目次次頁