5

IB、NSObjectController サブクラス、およびバインディングを使用するときにコントローラー ロジックを挿入する最良の方法を理解するのに苦労しています。

モデルとビューの間にコントローラー ロジックを挿入する必要がありますが、そのためのエレガントな方法を見つけるのに苦労しています。はい、ファイル所有者にアクションを送信し、そこでコントローラー ロジックを処理することはできますが、一部のコア データ モデルが深い関係構造を持つ 50 以上のエンティティに拡張できる場合、これは信じられないほどの量の定型コードにまで積み上げられます。

非常に単純化された例は次のとおりです。myTextWinter、myTextSpring、myTextSummer、myTextAutumn の 4 つの文字列属性を持つエンティティがあるとします。NSObjectController を介して IB でこれに接続するビューがあります。ここで、ユーザーがどこかのメニューから春、夏、秋、冬を選択して、表示したい「季節」を選択できるとします。その季節が選択されたときに、適切な季節のテキストを表示したいと思います。

この単純化された例では、おそらく NSDocument サブクラスでオブジェクトをフェッチし、ビューでバインドする mySeasonText というプロパティを作成し、NSUserDefaults で適切な季節を確認し、リクエストをモデル内の適切な属性にルーティングできます。 .

問題は、エンティティが 50 個あり、いくつかは 2 つ、3 つ、またはそれ以上の深さの関係があり、それぞれにシーズン メニューから選択するときに切り替えたい季節固有のテキスト属性のセットがある場合に発生します。または、より深いレベルでオブジェクトにアクセスするためにチェーン化された nsarraycontrollers の束がある場合。

今日まで、私は次のことを行ってきました。「mySeasonText」と呼ばれる各モデル オブジェクトにプロパティを追加し、コントローラー設定から設定を取得して、適切なシーズンにルーティングします。メニューで新しい項目が選択されるたびに、これらのオブジェクトを更新します。

これが機能し、大量のボイラープレート コードが削除されますが、コントローラー ロジックはモデルに含まれるようになりました。

もっと良い方法があるはずです!誰かが私を正しい方向に向けてもらえますか?

4

1 に答える 1

2

これはトリッキーなトピックです。Apple は、独自のドキュメントでこれらの課題について言及しています。

バインディング テクノロジを使用すると、モデル オブジェクトを直接観察して状態変化の通知を受け取るビューを持つ Cocoa MVC アプリケーションを簡単に作成できます。ただし、この設計には理論上の問題があります。ビュー オブジェクトとモデル オブジェクトは、アプリケーションで最も再利用可能なオブジェクトである必要があります。[…] 設計的には、モデル オブジェクトとビュー オブジェクトを互いに分離しておくのが最善です。これにより、再利用性が向上します。

探しているデザイン パターンは仲介コントローラーです。これは、cocoa-bindings クラスを使用してコントローラー ロジックを挿入する方法です。

仲介コントローラーは通常、Interface Builder ライブラリーからドラッグする既製のオブジェクトです。[仲介コントローラ] を構成して、ビュー オブジェクトのプロパティとコントローラ オブジェクトのプロパティの間、およびそれらのコントローラ プロパティとモデル オブジェクトの特定のプロパティの間のバインディングを確立できます。その結果、ユーザーがビュー オブジェクトに表示されている値を変更すると、新しい値がモデル オブジェクトに自動的に伝達されて保存されます (仲介コントローラーを介して)。モデルのプロパティがその値を変更すると、その変更がビューに伝達されて表示されます。

2 人の登場人物が話す必要がある映画やテレビ番組を見たことがありますが、彼らは同じ言語を話しませんか? 彼らは、それぞれが共通の言語を持っている他の誰か(またはコメディーでは5人の他の人)を見つけ、翻訳電話の巨大なゲームをプレイすることでコミュニケーションをとります.

仲介コントローラーはそのようなものです。

アプリケーションが成長するにつれて、この 1 つのビューのどこでこの 1 つのことを探すべきかについて、非常に具体的なルールをすべて学習します。これは、アプリを実行するために必要な種類のコードですが、モデルに入れると厄介だと感じるのは当然です。

いくつかの具体的で詳細な例について、Apple はこの驚くほど詳細なドキュメントを提供しています: Bindings Message Flow

これと関連する MVC + バインディングに関する非常に良い議論については、以下を参照してください。

于 2012-12-10T18:59:25.327 に答える