前回は、TinyViewがファイルを開いた時、どのようにそのファイルの中身が渡って来るのかを説明しました。いよいよファイルの中身を受け取る所まで来ましたね。まだプログラムは組んでいませんが。
それでは今回は、データを受け取った後のTinyViewの処理の流れを説明します。そして、どのようにプログラムを組んで行くのか方針を立てましょう。
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のようなアラートパネルを出してくれます。
[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ファイルのロードが完了したという通知を受け取ります。)
それでは、プログラムの方針を立てましょう。必要なのは、次の処理です。
ウィンドウをデザインした時、イメージを表示する場所はNSImageViewのインスタンスオブジェクトにしました。NSImageViewは、NSImageをセットすれば、後は勝手に描画してくれます。つまり、上記処理は次のようになります。
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日現在。既に内容が入れ替わっているようです。)
それでは、次回はいよいよコーディングです。がんばって行きましょう。