NSDocumentController


HOME > TIPS > Cocoa Programming Tips 1001 > Application Kit > NSDocumentController

NSDocumentController

Application Kit - NSDocumentController

NSDocumentController のサブクラスを使う

Keywords: NSDocumentController subclass

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

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

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

documentController.jpg

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];
}

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

openDialog.jpg

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



Application Kit