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

現在のTinyViewは、起動した時に空白のウィンドウが開きますが、描画も出来ないのに空白のウィンドウが開くのは無意味です。そこで、これを開かないようにしましょう。

起動時にウィンドウが開かないようにしよう(前編)

TinyViewが空白のウィンドウを開くのは、フレームワークが勝手にやっていることです。従いまして、フレームワークにこれを行わないように指示する必用があります。フレームワークの動作を変更するために行う方法として、一般的に思い浮かぶのは何かをセットすることだと思います。しかし、Cocoaでは別の方法を取ることがあります。それはdelegateを使うという方法です。

delegateというのは、簡単に言うと処理の委譲で、あるクラスのインスタンスオブジェクトの処理を、別のオブジェクトに任せてしまうという仕組みです。と、言葉で書いてもイメージが掴めないと思いますので、具体的な例を見てみましょう。NSWindowのリファレンスを見て下さい。

NSWindowのリファレンスを見て行きますと、Method Typesという項目があって、ここにメソッドの一覧があります。そのすぐ下にDelegate Method Typesという項目があると思います。これがサポートされているdelegate methodの一覧です。例えば、Windowがクローズされる直前に何かをしたい時には、この中のwindowWillClose:を利用することができます。どの様に利用するかと言うと、NSWindowクラスのインスタンスに対して、setDelegate:でdelegateであるオブジェクトを指定します。そうすると、そのオブジェクトの中にwindowWillClose:が実装されていれば、ウィンドウを閉じる直前にそれが呼び出されるようになるというわけです(fig.01)。

[fig.01] delegateの一例の概念図

オブジェクトはどんなクラスでもかまいませんし、自由に実装することができます。そして、Delegate Method Typesに書いてあるメソッドを全て実装する必用はありません。必用なメソッドだけを実装すれば、それだけが呼ばれるようになります。この様な柔軟な構造が取れるのが、Cocoaの魅力の一つでもあります。

それでは、TinyViewを起動した時に空白のウィンドウを開かないようにする指示を行う方法を探しましょう。アプリケーション全体に関わることですから、おそらくはNSApplicationにその仕組みがあるはずです。NSApplicationのリファレンスを見て下さい。

まずはMethod Typesを眺めてみましょう。それらしいメソッドはありません。そこで次にDelegate Method Typesを見て行きます。すると、applicationShouldOpenUntitledFile:というメソッドが見つかるはずです。説明を読むと、このメソッドがNOを返せばuntitled fileを開かないことが分かります。見つけましたね。それでは新しいクラスを作って、このメソッドを実装して行きましょう。

新しいクラスを作る時には、Project Builderのファイルメニューから「新規ファイル...」を選び(fig.02)、表示されたパネルから「Objective-C class」を選ぶことにより行えます(fig.03)。

[fig.02] ファイルメニューから「新規ファイル...」を選ぶ
[fig.03] 新規ファイルパネルから「Objective-C class」を選ぶ

第20回でカテゴリを作る時には、この方法を用いました。ですが、新しいクラスを作る方法は一通りではありません。今回はInterfaceBuilderから生成する方法を紹介しましょう。

ProjectBuilderのファイル一覧の中のResourcesというグループの中を見て下さい。この中に二つのnibファイルがありますが、連載の初めの方で、ドキュメントが開く度にローディングされるのが、MyDocument.nibだという説明をしたことを覚えていますでしょうか。ここにあるもう一つのnibファイルであるMainMenu.nibは、その名前から想像出来るように、中にメニューバーが入っています。つまり、こちらはアプリケーションが起動した時にローディングされるnibファイルです。今回は、TinyViewの起動時に必用な処理を組み込むのですから、InterfaceBuilderで開くのは、こちらのnibファイルです。なお、MyDocument.nibという名前がそうであったように、MainMenu.nibという名前も固定ではありません。アプリケーションが起動した時にローディングされるnibファイルは、Info.plistの中で指定されています。ProjectBuilderのターゲットタブを選んで、表示された一覧からInfo.plistのエントリを見て下さい。この中にCocoa固有の設定という項目がありますので、これを選んで内容を表示させて下さい(fig.04)。ここで指定されているメインnibファイルが、アプリケーション起動時にローディングされるnibファイルです。

[fig.04] Cocoa固有の設定に、メインnibファイルの指定がある

さて、それではいよいよMainMenu.nibを開こうと思うのですが、この続きは次回です。

前頁目次次頁