|
- 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
|