余計な新規ドキュメント作成をブロックするには?


Cocoaでドキュメントベースのアプリケーションを作成すると、以下の3つのタイミングで新規ドキュメントの作成が行われます。

(1) アプリケーション起動時
(2) ファイルメニューから新規作成を選んだとき
(3) ドキュメントを1つも開いていない状態でDockのアプリケーションアイコンがクリックされてアプリケーションがフォアグランドに出てきたとき

このうち(1)、(3)についてはうざったいと思われる方も多いのではないでしょうか。

いろいろ調べて見た結果、ファイルメニューからのみ新規ドキュメントが作成できるようにするには以下の方法で解決できることがわかりました。

MainMenu.nibにアプリケーションのDelegateとなるクラスを作成しインスタンス化する
上記インスタンスをNSAppplicationのインスタンス(File's Owner)のdelegateとして接続する
DelegateとなるクラスでNSApplicationのDelegateメソッドであるapplicationOpenUntitledFile:を実装し、復帰値として常にYESを返すようにする。

applicationOpenUntitledFile:のシンタックスは以下のようになっています。

- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication

AppleのドキュメントからはapplicationOpenUntitledFile:がこのような用途に使用できることは読み取れないのですが、実験して見たところ本メソッドは新規ドキュメント作成のうち、(1)と(3)の時のみ呼び出され、Delegate側で「ドキュメントはこっちで作ったからね」とYESでNSApplicationに答えればドキュメントコントローラーに対してドキュメントの作成要求を行なわないようです。

■訂正■

NSApplicationクラスのdelegateによる実装は同じですが、上記の方式よりは以下のdelegateメソッドを実装し固定値でNOを返すのが正しいようです。

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender

沼田さんの「Cocoa に関するヌマタメモ」を参考にさせていただきました。Thank you!!

サンプルプログラムのダウンロード(24KB)

【作成・確認環境】
Mac OS X v10.3.8
Xcode v1.5


一覧に戻る