Mac OS X用のBNRのCocoaプログラミング(第4版)の助けを借りてObjective-CとCocoaの学習を始めたばかりで、私はドキュメントベースのアプリケーションに取り組んでいます。私は、ドキュメントアーキテクチャに関するAppleの開発者向けドキュメントを読み、サブクラス化してサブクラスNSWindowController
を上書きすることを選択しました。これを行う理由はいくつかあります。makeWindowControllers
NSDocument
- モデルロジック(
NSDocument
サブクラス内)をビューロジック(サブクラス内)から分離しNSWindowController
ます。 - ドキュメントウィンドウのタイトルをカスタマイズする(Appleの開発者向けドキュメントによると、不要な副作用なしにこれを行う適切な方法は、サブクラス化
NSWindowController
してオーバーライドすることです。windowTitleForDocumentDisplayName:
- Appleのドキュメントは、最も単純なアプリケーションを除くすべてのアプリケーションのサブクラス化を強く示唆しているよう
NSWindowController
であり、私のものは間違いなく「単純」ではありません。
つまり、私のNSDocument
サブクラスはモデルコントローラーであり、私のNSWindowController
サブクラスはビューコントローラーです。さらに、ビューとモデルはアプリケーションに依存せず、可能な限り再利用可能である必要があるため、アプリケーションの「作業」のほとんどはコントローラーオブジェクトで行われることを理解しています。ここで私の質問があります。これらの2つのタイプのコントローラーは、実際にこの「動作」を行うためにどのように相互作用するのでしょうか。
たとえば、スプレッドシートアプリケーションを作成していて、データの一部からグラフやグラフを作成するためのシートを表示するメニュー項目(またはツールバーボタン)が必要だとします。そのシートに、ユーザーはチャートまたはグラフの作成方法に関するさまざまなパラメーターとオプションを入力し、[OK](またはボタンが呼び出されたもの)をクリックします。
メニュー項目のアクション、ドキュメント(モデルコントローラー)またはウィンドウコントローラー(ビューコントローラー)に誰が応答する必要がありますか?シートを実際にロードして表示するタスクは明らかに「ビュー関連」のように見えるので、ウィンドウコントローラーに配置する必要があります。ただし、シートのコントローラーには、ユーザーに表示するモデル(Chart
オブジェクト、または多分ChartInputs
)が必要です。そのモデルはどこで作成され、シートコントローラーに渡されますか?ドキュメントを作成してメニュー項目に応答する必要がありますChartInputs
モデルオブジェクト、それをウィンドウコントローラーに渡します。ウィンドウコントローラーはシートコントローラーを作成し、モデルオブジェクトを渡し、シートを表示しますか?または、ウィンドウコントローラーがメニュー項目に応答する場合は、新しいモデルオブジェクトを要求し(おそらく、ウィンドウコントローラーのコンストラクターへの依存性注入によって提供されるある種のファクトリを介して)、シートコントローラーの作成、モデルの受け渡し、および表示に進みます。シート?
ユーザーがシートに記入して[OK]をクリックした後はどうでしょうか。ユーザーの選択を処理し、実際にチャートを作成するために、コントロールをどこに戻す必要がありますか?ウィンドウコントローラー、ドキュメント、またはその両方ですか?ユーザーが[OK]をクリックした後、シートが閉じられる前に(何かが無効な場合)、ユーザーの入力を検証するロジックはどうですか?