2011-12-01 6 views
4

私は最初の深刻なCocoaアプリケーションを構築しています。それは、永続的なストレージのためにコアデータを使用するドキュメントベースのアプリケーションです。 Xcodeの「新規プロジェクト」テンプレートオプションを使用して、私のプロジェクトは、デフォルトクラスのカップルで開始:NSDocumentControllerはドキュメントベースのアプリケーションにどのように挿入されますか?

  • MainMenu.xib(私のアプリのメインメニュー)私のアプリの
  • EventDocument.xib(メインウィンドウ)
  • EventDocument.hとEventDocument.m(永続ドキュメントクラス)

私は私ではなかったのCocoaクラスのNSDocumentController出くわししかしanother questionを通じて、私はそこからデザインを取り、それがすべてではうまく動作します、むしろ知っている。このクラスは、ドキュメントベースのアプリケーションでドキュメントクラスを管理するためのデフォルトロジックを提供します。

私の質問は、このクラスが私のアプリにどのように入っているのですか?現時点では、トップレベルコントローラの一種としてEventDocumentクラスを使用しています。メニューからユーザーの選択肢(iTunesのオプションを持つツリービュー)を取得し、これらのオプションを処理し、管理オブジェクトコンテキストを回るさまざまなビュー/コントローラを表示します。 NSDocumentControllerが "行く方法"なら、なぜAppleがプロジェクトテンプレートの一部としてそれを生成しないのですか?

+0

他の質問へのリンクを提供し、NSDocumentControllerが必要と思われる理由を説明できますか? –

+0

現在のデザインがうまくいくので、私はそれが必要だとは思わないほどです。私はちょうど私がココアのアプリに共通のデザインパターンを見逃しているかどうか疑問に思っていた。 – Roger

+0

質問へのリンクを追加しました... – Roger

答えて

8

NSDocumentControllerの目標を誤解していると思います。NSWindowControllerとNSViewControllerの名前が類似しているからです。

Cocoa MVCでは、コントローラがビューとモデルを仲介します。ウィンドウを扱うとき、コントローラはNSWindowControllerのサブクラスであり、ビューの場合はNSViewControllerのサブクラスです。

ドキュメントベースのアーキテクチャでは、NSDocumentクラスはドキュメントを表すモデルと対応するビューとコントローラの間のメディエータです。基本的には、外部表現に基づいてモデルを再作成し、モデルとビューに対応するコントローラの動作を付加する何らかの方法を提供します。 2つの設計は、一般的に、そのために使用される:

  • NSDocumentのサブクラスは、有効ウィンドウ(潜在的に同様に表示)コントローラとして機能 - 例えば、IBActionsを実装すること。これは単純なアプリケーションではうまくいくはずですが、すぐに肥大化したNSDocumentサブクラスにつながり、必要以上のものを扱うことができます。 documentationさんのコメント:

    デフォルトのドキュメントベースのアプリケーションプロジェクトテンプレートでは、NSWindowControllerのサブクラス化は行われません。単純なアプリケーションを作成する場合、NSWindowControllerをサブクラス化する必要はありません。ただし、より高度な要件を持つアプリケーションを作成する場合は、ほとんどの場合、そのようにしたいと考えています。

  • NSDocumentサブクラスはカスタムウィンドウコントローラを作成します。カスタムウィンドウコントローラは、コントローラの動作を実装し、潜在的にビューコントローラも使用します。ウィンドウコントローラ、ビュー・コントローラ、またはあなたのNSDocumentのサブクラスの内側になり、アプリケーションのコントローラ部 - 多くの(?ほとんどの)場合には

のNSDocumentControllerサブクラスは必要ありません。つまり、documentationで説明されているように必要な場合があります。

通常、NSDocumentControllerをサブクラス化する必要はありません。サブクラス化によって実行できるほとんどのものは、アプリケーションのデリゲートによって簡単に実行できます。ただし、必要に応じてNSDocumentControllerをサブクラス化することは可能です。

たとえば、[開く]パネルをカスタマイズする必要がある場合は、NSDocumentControllerサブクラスが必要です。 NSDocumentControllerメソッドのrunModalOpenPanel:forTypes:をオーバーライドして、パネルをカスタマイズしたり、アクセサリビューを追加することができます。 addDocument:およびremoveDocument:メソッドは、ドキュメントのオープンまたはクローズを知りたいサブクラスに提供されます。

+2

さらに、NSDocumentController *がドキュメント*を所有しているのに対し、NSDocumentは少なくとも1つのウィンドウコントローラといくつかのビューコントローラを所有しています。所有権階層では、文書コントローラーは文書の親であり、子孫ではありません。 (ドキュメントコントローラが1つだけであるのに対して、開いているドキュメントはいくつでも構いません。 –

関連する問題