パターン MVC に準拠したいのですが、「cellForRowAtIndexPath」メソッドをどこに移動する必要があるかを尋ねます:/現時点では、このメソッドはコントローラー ファイルにあるためです。
2 に答える
モデル (M) とコントローラー (C) のどちらに配置する必要があるかを尋ねていると思います。UITableView には 2 つのプロトコルがあるため、これは興味深い質問です。
UITableViewDelegate
UITableViewDataSource
まあ、UITableViewDelegate プロトコルは、ビューの「所有者」のためのもので、通常はコントローラーになります。それ以外のことを前提とするコードは見たことがありません。
では、UITableViewDataSource はどこに配置すればよいのでしょうか? これは、定義するプロトコルです。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
さて、もし Apple の開発者がそれを Controller に入れると想定していたなら、それを UITableViewDelegate プロトコルに組み込んでみませんか? ドキュメントには次のように書かれています(太字で):
UITableViewDataSource プロトコルは、UITableView オブジェクトのアプリケーションのデータ モデルを仲介するオブジェクトによって採用されます。データ ソースは、テーブル ビューの作成と変更に必要な情報をテーブル ビュー オブジェクトに提供します。
データ モデルの代表として、データ ソースはテーブル ビューの外観に関する最小限の情報を提供します。テーブル ビュー オブジェクトのデリゲート (UITableViewDelegate プロトコルを採用したオブジェクト) は、その情報を提供します。
したがって、モデルに配置する必要があることを示唆しているように見えますが、実際には「アプリケーションのデータモデルを仲介する」ということは、コントローラーに配置する必要があることを意味しますが、 (プロトコルUITableView
を介して) 実際に管理するコントローラーとは異なる可能性があります。UITableViewDelegate
これをいくつかの異なる方法でレイアウトする柔軟性があるように思えますが、一般的な結論は、私が見たコードの99%で、UITableViewDelegate
デリゲートでもあるコントローラーにあるということです。
MVCに関する Apple のドキュメントは次のとおりです。/TP40010810-CH14-SW9
コントローラー オブジェクト (MVC の C) の目的は、モデル オブジェクトをビュー オブジェクトと連携させることです。したがって、メソッド cellForRowAtIndexPath の性質により、特定のセル (ビュー) にデータ (モデルから取得される) が入力され、それがコントローラーに属することが決まります。
このアプローチは、UITableViews および UITableViewControllers に関連するすべての Apple のサンプル コードで示されています。