从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
属性。并明确要求它的区域/类型。
答
我非常新的这个,所以我可能是错的,但不会是更好,如果用于构建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
作为依赖项从您的自定义类中注入。
我同意建筑的观点。设置一个属性。 –
同意。你也可以使用'gameZone'来自动形成一个单元格标识符。这样,当您添加新的区域时,您不需要更改表格代码。或者...你可以给'GameZone'添加一个返回适当单元格的类('return [genericGameAtRow tableViewCell]')。我会在这里使用一个类别来保持UIKit的东西不在数据模型代码中。所有优良的解决方案,比'isKindOfClass'更好。 –
非常感谢,这是一个很好的观点,我会重新考虑它并添加一个gameZone属性。还要感谢Rob。 – fuzzygoat