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

前回は、TinyViewがファイルを開いた時、どのようにそのファイルの中身が渡って来るのかを説明しました。いよいよファイルの中身を受け取る所まで来ましたね。まだプログラムは組んでいませんが。

それでは今回は、データを受け取った後のTinyViewの処理の流れを説明します。そして、どのようにプログラムを組んで行くのか方針を立てましょう。

MyDocumentのメソッドの呼ばれる順番

MyDocument.mの中身を見て下さい。前回、ファイルを開くとloadDataRepresentation:ofType:が呼び出され、ファイルの中身が渡って来ることを確認しました(- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aTypeと宣言されているメソッドの名前は、loadDataRepresentation:ofType:です。)。実は、これよりも前に呼び出されているメソッドがあります。それは、initです。

- (id)init

これは、このクラスをインスタンス化した直後に行う初期化処理です。何か初期化が必要な時は、ここに書き加えます。これが呼び出された後に、ファイルを読み込み、loadDataRepresentation:ofType:が呼び出されます。

- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType

雛形では決め打ちでYESを返していますが、本来は処理が成功した時はYESを、失敗した時にはNOを返します。NOを返すと、fig.01のようなアラートパネルを出してくれます。

ProjectBuilderのアイコン
[fig.01] Open出来ない時に表示されるアラートパネル

次に呼ばれるのは、windowNibNameです。

- (NSString *)windowNibName

このメソッドは、ウィンドウを開くためにどのNibファイルをロードするのかという問い合わせのために呼ばれます。雛形では、決め打ちで"MyDocument"を返しています。以前、第2回と第3回で、ウィンドウのデザインを変更したことを覚えていますでしょうか。あの時編集したのは、MyDocument.nibという名前のnibファイルでした。ここで"MyDocument"という名前を返しているので、あのnibファイルがロードされるというわけです。

次に呼ばれるのは、windowControllerDidLoadNib:です。

- (void)windowControllerDidLoadNib:(NSWindowController *) aController

これは、Nibファイルのロードが終わったぞと言う通知です。Nibファイルがロードされるまで、Nibファイル上で定義したオブジェクトは実体を持ちません。それにはウィンドウも含まれていますので、そこにイメージを表示できるのは、このメソッドが呼び出されてからということになります。

まとめますと、雛形のMyDocument.mのメソッドは、ファイルを開く時に次の順番に呼び出されることになります。

- (id)init
(インスタンスオブジェクトの初期化処理です。)
- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType
(開いたファイルの中身が渡って来ます。)
- (NSString *)windowNibName
(ロードするnibファイルの名前を返します。)
- (void)windowControllerDidLoadNib:(NSWindowController *) aController
(nibファイルのロードが完了したという通知を受け取ります。)

それでは、プログラムの方針を立てましょう。必要なのは、次の処理です。

  1. 読み込んだJPEGファイルの中身を、表示出来るように展開。
  2. 展開した結果を、ウィンドウ上のイメージを表示する場所に描画。

ウィンドウをデザインした時、イメージを表示する場所はNSImageViewのインスタンスオブジェクトにしました。NSImageViewは、NSImageをセットすれば、後は勝手に描画してくれます。つまり、上記処理は次のようになります。

  1. 読み込んだNSDataをNSImageに展開。
  2. NSImageをNSImageViewにセット。

1.の処理は、loadDataRepresentation:ofType:に実装すれば良いでしょう。NSImageへの展開に成功した時はYESを、失敗した時はNOを返すことにします。2.の処理は、Nibファイルをロードした後でないと行えないので、windowControllerDidLoadNib:に実装することになるでしょう。となると、loadDataRepresentation:ofType:の中で展開したNSImageを、何らかの方法でwindowControllerDidLoadNib:の中の処理に引き渡さなければなりません。そこで、これはインスタンス変数経由で引き渡すことにします。これでうまくいきそうですね。

では、実際のコーディングは次回行うことにしまして、今回はこれで終わりですが、その前に、コーディング時に役に立つ知識として、各クラスのリファレンスがどこにあるのかを記しておきます。Developer Toolsをドキュメントも含めてインストールした場合(普通にインストールすれば、そうなっているはずです。)、Cocoaのドキュメントの入り口は、下記URLにあります。

file:///Developer/Documentation/Cocoa/CocoaTopics.html

2列目がReference Documentationになっていますが、この真ん中に、Objective-C Framework Referenceというのがあります。この中のApplication KitとFoundationが、Cocoaのフレームワークのリファレンスです。Cocoaのフレームワークは、基本的な部分のFoundationと、UI等、アプリケーションに必要な部分のApplication Kitの二つに分類されています。それぞれを選ぶと、クラスの名前が一覧表示されますので、その中から調べたいクラスを選択すれば良いわけです。

なお、このドキュメントはオンラインでも提供されており、それは下記URLにあります。

http://developer.apple.com/techpubs/macosx/Cocoa/CocoaTopics.html
(注:2003年7月28日現在。既に内容が入れ替わっているようです。)

それでは、次回はいよいよコーディングです。がんばって行きましょう。

前頁目次次頁