5

ビューmyView、ビューコントローラーmyViewController、およびある種のモデルオブジェクトmyModelがあるとします。さらに、モデルに2つのKVO準拠のプロパティarrayOfPeopleNamesarrayOfAnimalKinds(両方のNSString)があるとします。

私の見解では、これら2つの配列の内容にバインドされた2つのポップアップが必要です。

私の質問は、myControllerにmyModelへの参照があり、ドロップダウンがmyViewControllerにバインドされている場合、myModel.arrayOfPeopleNames?の行に沿ってキーパスを設定することをお勧めします。

または、myModelのNSArrayをミラーリングし、代わりにそのキーパスにバインドする追加のNSArrayをmyViewControllerに設定する必要がありますか?

前者は実装の観点からははるかに単純に見えますが(コントローラー配列をモデル配列にミラーリングする必要はありません)、モデルをビューに多く公開するかどうか疑問に思っています。

意見?

4

1 に答える 1

8

コントローラーでモデルの配列をミラーリングしないでください。非常に単純なケースでは、モデルの配列に直接バインドすることについてあまり気にしませんが、モデルの配列を管理する NSArrayController に UI オブジェクトをバインドすることもできます。これにより、モデルと UI が分離され、さらに重要なことに、並べ替え、選択、オブジェクトの追加と削除などのタスクが処理されます。

KVO とバインディングが「純粋な」モデル ビュー コントローラーの設計に違反していることを心配することで、あなたがどこから来ているかがわかりますが、心配する必要はありません。KVO 通知はモデルからビューに直接渡されますが、ビューとモデル間の接続の設定と変更は依然としてコントローラーの責任です (この場合のみ、代わりに IB を介して行われます)。たとえば、モデル オブジェクトがビューへの参照を取得したり、それ自体を UI にバインドしたりしたくない場合は、コントローラーの責任になります。

避けるべき別の例として、モデルに名前の代わりに「動物 ID」の配列があるかどうかを考えてみましょう。モデル内で動物 ID を人間が読める動物名に変換するメソッドを作成する代わりに、変換を行う値トランスフォーマーまたはフォーマッターを作成することをお勧めします。これにより、モデルとビューの間の分離レベルを維持できます。

また、デザイン パターンの目的は、問題の解決策をコーディングする複雑さを軽減することであり、複雑さを増すことではないことにも注意してください。パターンの最も厳密な定義に常に準拠しているわけではありませんが、これが Cocoa の動作とまったく同じであることがわかります。

于 2008-12-10T18:12:19.763 に答える