从cellForRowAtIndexPath返回多个UITableViewCell子类?

问题描述:

我期待返回根据对象的我从我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吗? ... 只是好奇。

是的,这是一个正确的解决方案。

我个人从-[id<NSObject> isKindOfClass:]敬而远之,因为它通常是坏建筑的标志。相反,我会为savedGames阵列中的所有可能的类添加gameZone属性。并明确要求它的区域/类型。

+1

我同意建筑的观点。设置一个属性。 –

+1

同意。你也可以使用'gameZone'来自动形成一个单元格标识符。这样,当您添加新的区域时,您不需要更改表格代码。或者...你可以给'GameZone'添加一个返回适当单元格的类('return [genericGameAtRow tableViewCell]')。我会在这里使用一个类别来保持UIKit的东西不在数据模型代码中。所有优良的解决方案,比'isKindOfClass'更好。 –

+0

非常感谢,这是一个很好的观点,我会重新考虑它并添加一个gameZone属性。还要感谢Rob。 – fuzzygoat

告诉你的代码是好的,而且是正确的道路要走。

+0

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

我非常新的这个,所以我可能是错的,但不会是更好,如果用于构建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 

作为依赖项从您的自定义类中注入。