2012-01-25 7 views
1

モデルオブジェクトの内容でカスタムテーブルビューセルを構成する必要があります。どちらが好ましいデザインパターンですか?私は「正しい」答えを探しているわけではなく、賛否両論の良い議論を探しています。オブジェクト/構造体をUITableViewCellに渡すか、configureCellでセルを設定します:atIndexPath :?

1)configureCellでセルを手動で設定する:atIndexPath :?


- configureCell:atIndexPath: 
    { 
    myCell.field1 = modelObject.field1 ; 
    myCell.field2 = modelObject.field2 ; 
    } 

2)だけでモデルオブジェクトを受け入れ、configureCellのセルにモデルオブジェクトの卸売を渡すためにカスタムセルをコーディング:atIndexPathを:?


- configureCell:atIndexPath: 
    { 
    myCell.model = modelObject ; 
    } 

Law of Demeterによれば、おそらく(1)が優れています。しかし、セルがユーザアクションを処理する必要がある場合、テーブルビューの方が適切なコントローラか、セル自体(セルをViewModelとして使用しますか)ですか?私は後者は明確コードのために作ることができる確かに考える:コントローラとして表ビュー

1)ビヘイビア


// tableview 
- configureCell:atIndexPath: 
    { 
    myCell.field1 = model.field1 ; 
    myCell.button.delegate = myDelegate ; // have to define MyDelegate protocol 
    } 

// Call behavior in cell 
[self.button.delegate delegateCall] ; 

// delegate 
- (void) delegateCall 
    { 
    // find out which cell was manipulated 
    // find the object associated with the table cell 
    [theFoundModelObject myBehavior] ; 
    } 

ビューモデルとして細胞と2)行動:私は好む


- configureCell:atIndexPath: 
    { 
    myCell.model = modelObject ; // cell has direct access to model behavior 
    } 

// Call behavior in cell 
[self.model myBehavior] ; 

答えて

1

私は#2の特定の形式のファンです。

コントローラーがセル内のすべての設定を行う必要があるとは思わないが、セルがモデルより長く保持されるとは思わない。関数は、モデルへの参照を保持するが、細胞の状態を更新するために、モデルのプロパティを使用していません

- (void)updateCellWithModel:(YourModel *)model;

:だから、私の細胞のサブクラスは、形式の方法を持っています。私はすべてのモデルCoreDataをバックアップしたいので、NSFetchedResultsControllerのフックを使ってセルを正しく更新します。

3

カスタムセルサブクラスを作成し、モデルオブジェクト全体を渡してそれ自体を構成するアプローチ。

後でセルがモデルの余分なフィールドを使用する必要があると判断し、ビューコントローラを更新しなくてもセルのビジュアルレイアウトとモデルの内部構造を自由に変更できる場合、最大限の柔軟性があります。

関連する問題