MVC モデルにはさまざまなバリエーションがあります。Cocoa に関する Apple のドキュメントはこちらです: http://developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View -Controller.html#//apple_ref/doc/uid/TP40010810-CH14-SW9 .
ここから得た主なことは、ビューをモデルに直接リンクしてはならないということです。次の図を参照してください。
モデルUITableViewCells
オブジェクトのプロパティを持つことがよくありますが、これは間違っていると思います。パターンは次のようになります。
- モデルは、実際のデータの保存と管理をすべて処理します
- ビューは、表示されているデータのタイプを認識していますが、データ自体は認識していません。
- コントローラー(UITableViewController) は、モデルからデータを取得してビューをセットアップする「接着剤」です。
これは実際にはどのように機能しますか?
次の疑似コードを直接入力しただけなので、いくつかの間違いをお許しください。テストはしていませんが、要点を示していることを願っています。
したがって、UITableViewCell
次のようなサブクラスがあります。
@interface PhoneEntryTableViewCell {
@property (weak) IBOutlet UILabel *personName;
@property (weak) IBOutlet UILabel *phoneNumber;
}
モデルは次のようになります。
@interface PhoneModel {
@property (strong) NSMutableArray *listOfPeople;
}
そして、標準/メソッドをUITableViewController
実装します。たとえば、次のようになります。UITableViewDelegate
UITableViewDataSource
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Person *person = [myModel personForIndex:indexPath.row];
PhoneEntryTableViewCell *cell = [self dequeueReusableCellWithIdentifier:@"PhoneCell"];
cell.personName.text = [person name];
cell.phoneNumber.text = [person phoneNumber];
return cell;
}
要約すると、Viewは実際のデータをまったく把握していません。ビューは、個人の名前と電話番号を表示する必要があることを認識しているだけです。バックエンド ストレージが何であるかを認識していません。コア データ、ファイル、ダウンロードおよび解析された JSON などである可能性があります。モデルについては何も認識していません。たとえば、モデルに関する他のデータを保存している可能性があります。人、たぶん電話番号は実際には名前とは別のモデルに保存されています。Controllerは、このすべての作業を処理します。
なぜこのようにするのですか?
したがって、上記のアプリケーションをロールアウトすると、Modelが非常に遅いことがわかります。 Viewに触れずに、完全に異なるモデルに交換できます。おそらく、別の開発者またはデザイナーにビューを作成してもらうことができます。彼らが知る必要があるのは、2 ビットのテキストを表示する必要があるということだけです。基本的に、コードをクリーンで明確に分割し、拡張しやすく、リファクタリングしやすくします。
ビューで次のようなことを行うとすぐにUITableViewCell
、これらすべてがなくなります。
@property (strong) Person *person;