HMDT - Logic and Intuition -

about HMDT

Cocoa Programming Tips 1001

Application Kit

NSDocumentController

Application Kit - NSDocumentController

NSDocumentController のサブクラスを使う

Keywords: NSDocumentController subclass

NSDocumentController は、ドキュメント・ベース・アプリケーションで Document を管理する根幹のクラス。こいつのインスタンスは、アプリケーションで最大 1 つしか作られないんだ。NSDoucmentController の動きを制御するには、こいつのサブクラスを作ればいいんだけど、さてどうやってインスタンスをつくればいいんだ?

NSDocumentController のインスタンスは、クラスメソッドである sharedDocumentController が呼ばれた時点で作られるらしい。ということは、それより先に NSDocumentController のサブクラスを作ってしまえば、そっちが使われるはずだ。

そのためにはどうすればいいのか?ここでは .nib の中でインスタンスを作る、という技を使ってみよう。ターゲットで設定する「メイン nib ファイル」は、アプリケーションが起動するときに呼び出されるようだ。その中に NSDocumentController のサブクラスのインスタンスを置いておけば、メイン nib ファイルが読み込まれた時点でインスタンスが作られるんだ。

MyDocument... っていうのは、MyDocumentController のことで、NSDocumentController のサブクラス。こうすれば、NSDocumentController のサブクラスを使うことができるぜ。

Application Kit - NSDocumentController

NSDocumentController のオープンダイアログを拡張する

Keywords: setAccessoryView

Cocoa でドキュメント・ベース・アプリケーションを作ると、メニューの「開く」を選択すると、勝手にオープンダイアログが出てくるよね。これはこれで便利なんだけど、このダイアログを拡張したいときはどうすればいいんだ?

それには、NSDocumentController のサブクラスを作って対処する。まず、上で見た方法で NSDocumentController のサブクラスを作ろう。そしたら、そのサブクラスで runModalOpenPanel:forTypes: をオーバーライドする。

Application Kit/NSDocumentController.h

- (int)runModalOpenPanel:(NSOpenPanel *)openPanel 
                forTypes:(NSArray *)extensions;

このメソッドは、引数の openPanel を表示させるためのものだ。親クラス(つまり NSDocumentController)がオープンダイアログを表示する前に、openPanel をいじってしまえばいいのだ。

というわけで、サンプル。ここでは openPanel に、エンコーディングのためのアクセサリビューを追加している。

OpenWithEncoding/MyDocumentController.m

- (int)runModalOpenPanel:(NSOpenPanel*)openPanel 
                forTypes:(NSArray*)extensions
{
    // アクセサリビューを設定する
    [openPanel setAccessoryView:_accessoryView];
    
    return [super runModalOpenPanel:openPanel forTypes:extensions];
}

これでオープンダイアログの見た目が変わるぜ。実行結果はこんな感じだ。

■サンプルダウンロード:
OpenWithEncoding.tar.gz

back to top content

Copyright © 2002-2006 HMDT. All rights reserved.