如何有效地实现具有相同不同内容的多个自定义UITableViewCell?

时间:2014-01-26 01:02:14

标签: ios objective-c uitableview

我在管理应用的用户界面时遇到问题。该应用程序使用UITableView,具有多个原型单元格。 一切顺利,我有:

TypeACell.h + m files
TypeBCell.h + m files
TypeBCell.h + m files
etc.

我在Storyboard的UITableView中创建了原型单元格,其中有6个,每个都连接到特定类型的单元格。

事情是,每个自定义单元格中至少有4个元素可以在每个单元格中重复使用。 我们假设每个自定义单元格中只有2个元素不同。

为了论证,让我们想象细胞看起来像这样:

TypeACell
    row1
    row2
    rowCustomA1
    rowCustomA2
TypeBCell
    row1
    row2
    rowCustomB1
    rowCustomB2
etc.

然后在cellForRowAtIndexPath中我有类似的东西:

if(array[i] == TypeA){
    TypeACell *cell = [tblView dequeueReusableCellWithIdentifier:typeAIdentifier]; 
    set row1,row2, rowCustomA1, rowCustomA2;
    display TypeACell
}
else if(array[i] == TypeB){
    TypeBCell *cell = [tblView dequeueReusableCellWithIdentifier:typeBIdentifier]; 
    set row1,row2, rowCustomB1, rowCustomB2;
    display TypeBCell
}

事实是,使用这种实现,我必须修改12个位置才能进行更改,这对所有单元格来说都很常见。我正在寻找一种方法来修改我的实现。我一直想知道是否存在某些Objective-C特定方法可以帮助我处理这种废话。能否请您提供您的经验和建议?

编辑: 将细胞初始化添加到每个"如果"。现在,这只是我在基于继承的实现中无法解决的问题。

2 个答案:

答案 0 :(得分:1)

这是您可以从继承中受益的地方:使用所有单元格类型共有的元素创建基类,然后将单个单元格类型作为其子类,如下所示:

@interface CommonCell : UITableViewCell
    ... // Common properties
@end
@interface TypeACell : CommonCell
    ... // Properties specific to A
@end
@interface TypeBCell : CommonCell
    ... // Properties specific to B
@end
@interface TypeCCell : CommonCell
    ... // Properties specific to C
@end

现在可以按如下方式更改循环:

for(iteration over array){
    CommonCell *cell = ...
    ... // set common elements
    set row1, row2
    if(array[i] == TypeA){
        set rowCustomA1, rowCustomA2;
    }
    else if(array[i] == TypeB){
        set rowCustomB1, rowCustomB2;
    }
    ...
    display cell
}

答案 1 :(得分:1)

我不明白为什么你需要超过1个UITableViewCell子类。

  1. 使单元格中的属性尽可能通用:( row1,row2,row3,row4)。
  2. 每个单元格的不同外观仅在原型中。
  3. 您只需要区分数组-tableView:cellForRowAtIndexPath:中的不同类型。
  4. 示例:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        int cellType = array[indexPath.row];
        NSString *cellID = cellType == TypeA ? typeAIdentifier : typeBIdentifier;
        MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    
        cell.row1 = …
        cell.row2 = …
        cell.row3 = cellType == TypeA ? … : …;
        cell.row4 = cellType == TypeA ? … : …;
    
        return cell;
    }