我希望返回一些自定义UITableViewCells,具体取决于我从savedGames
中存储的dataModel
数组中返回的对象类型。我的问题是,我是以正确的方式来做这件事的吗?我以前没有这样做过,只是想确保我走在正确的轨道上,不要错过任何明显的东西。
注意:新的单元格在其他地方被分配和初始化,这就是为什么它没有显示在下面的代码中。
- (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非常有用,我知道它避免了没有返回值的方法,但是如果没有“if”s就会触发你的“必须返回一个单元格“错误。显然,覆盖所有可能的选项很重要,但最终返回不会更好地返回默认(vanilla)UITableViewCell吗? ......只是好奇。
答案 0 :(得分:5)
是的,这是一个正确的解决方案。
就个人而言,我会远离-[id<NSObject> isKindOfClass:]
,因为它通常是糟糕建筑的标志。相反,我会在gameZone
数组中为所有可能的类添加savedGames
属性。并明确要求它的区域/类型。
答案 1 :(得分:1)
您展示的代码没问题,是正确的方法。
答案 2 :(得分: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
因为依赖项是从您的自定义类中注入的。