2011-07-19 85 views
3

我期待返回根據對象的我從我savedGames陣列回到儲存在我的dataModel類型了許多定製UITableViewCells的。我的問題是,我正在以正確的方式進行討論?我之前沒有這樣做,只是想確保我在正確的軌道上不會錯過一些明顯的事情。從cellForRowAtIndexPath返回多個UITableViewCell子類?

注:新細胞的alloc-ED和init-ED的其他地方,這就是爲什麼未在下面的代碼所示。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    SharedDataModel *dataModel = [SharedDataModel sharedInstance]; 
    id genericGameAtRow = [[dataModel savedGames] objectAtIndex:row]; 

    if([genericGameAtRow isMemberOfClass:[GameZoneOne class]]) { 
     CellZoneOne *cell = [tableView dequeueReusableCellWithIdentifier:@"ZONEONE_ID"]; 
     return cell; 
    } 

    if([genericGameAtRow isMemberOfClass:[GameZoneTwo class]]) { 
     CellZoneTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"ZONETWO_ID"]; 
     return cell; 
    } 
    return nil; 
} 

編輯:快速的問題是在底部有用返回nil,我知道這避免了沒有返回值的方法,但如果沒有「如果」的火你會得到一個「必須返回一個單元格「錯誤。顯然它的重要性在於涵蓋了所有可能的選項,但是最終返回不是更好地返回默認(香草)UITableViewCell嗎? ... 只是好奇。

回答

5

是的,這是一個正確的解決方案。

我個人從-[id<NSObject> isKindOfClass:]敬而遠之,因爲它通常是壞建築的標誌。相反,我會爲savedGames陣列中的所有可能的類添加gameZone屬性。並明確要求它的區域/類型。

+1

我同意建築的觀點。設置一個屬性。 –

+1

同意。你也可以使用'gameZone'來自動形成一個單元格標識符。這樣,當您添加新的區域時,您不需要更改表格代碼。或者...你可以給'GameZone'添加一個返回適當單元格的類('return [genericGameAtRow tableViewCell]')。我會在這裏使用一個類別來保持UIKit的東西不在數據模型代碼中。所有優良的解決方案,比'isKindOfClass'更好。 –

+0

非常感謝,這是一個很好的觀點,我會重新考慮它並添加一個gameZone屬性。還要感謝Rob。 – fuzzygoat

1

告訴你的代碼是好的,而且是正確的道路要走。

+0

謝謝文斯,非常感謝。 – fuzzygoat

0

我非常新的這個,所以我可能是錯的,但不會是更好,如果用於構建UITableView的陣列中的每個項目有它自己的特性來構建細胞?

所以,你可以不喜歡

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
int row = [indexPath row]; 
[_myArray[row] formatCellAndSetData]; 

,或者甚至

return [_myArray[row] buildCell]; 

每個自定義的東西的UITableViewCell類都將具有相同的方法formatAndSetData但每個可以以不同的實現它。這種方式不依賴於:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

作爲依賴項從您的自定義類中注入。

相關問題