从cellForRowAtIndexPath返回多个UITableViewCell子类?

时间:2011-07-19 15:05:49

标签: iphone objective-c cocoa-touch

我希望返回一些自定义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吗? ......只是好奇。

3 个答案:

答案 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 

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