1

首先, UITableViewCell 像这样注册以供重用

UINib *cellLoader=[UINib nibWithNibName:@"GroupCell_iPhone" bundle:nil];
[self.tableView registerNib:cellLoader forCellReuseIdentifier:@"GroupCell"];

然后在 cellForRowAtIndexPath 委托中

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

单元格出列

GroupCell_iPhone *cell=(GroupCell_iPhone*)[self.tableView dequeueReusableCellWithIdentifier:@"GroupCell"];

然后根据一系列标准动态创建一系列 UILabel 和其他对象,并像这样添加到单元格中

[cell.contentView addSubview:noActivityLabel];

当第二个和后续单元格出列并且似乎具有来自第一个出列单元格的动态添加的对象时,就会出现问题。最后,每个细胞都会不同。出队的单元格是指向 UITableViewCell 一个实例的“指针”吗?为什么这些随后出列的单元格具有第一个的内容?

如果是这种情况,创建具有动态/变化内容的单元格的最佳方法是什么?每次都应该创建一个新的单元格实例吗?可以“克隆”出队的单元格吗?

澄清:表格中的所有单元格都以基本布局开始,但随后根据与该单元格关联的一些数据将唯一内容添加到每个单元格。因此,表格中的每个单元格都是唯一的,即单元格中有不同的子视图(UILable、UIImageView 等)。

4

2 回答 2

0

我不确定这是否是最好的方法,但我做了以下事情:

创建了一个具有多个子类的 CustomCellClass:CustomCellType1、CustomCellType2 Custom CellType3 等。其中 CustomCellSubclasses 都使用同一模型的不同部分来显示信息。

然后,我可以给 CustomCellClass 添加一个 prePareDataForCell 函数来设置一些基本属性。如果 CustomCellSubclass 需要它们,它就会拥有它们,如果不是,事情就会发生相同的变化(我认为,这是我不确定这是否是好的做法的部分)。

然后我可以做一些这样的伪代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCellClass *returnCell = (CustomCellClass*)[tableView cellForRowAtIndexPath:indexPath];
    MyObject *obj = [self.fetchedResultsController objectAtIndexPath:indexPath];

    if ([returnCell.reuseIdentifier isEqualToString:CustomCellType1) {
        CustomCellType1 *cell = (CustomCellType1*)[tableView dequeueReusableCellWithIdentifier:CustomCellType1];

        if (!cell) {
            cell = [[CustomCellType1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CustomCellType1];
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellType1" owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];
        }
        // This is a basic cell doesn't need anything special done with the object model
        returnCell = cell;
    } else if ([[returnCell reuseIdentifier] isEqualToString:CustomCellType2]) {
        CustomCellType2 *cell = (CustomCellType2 *)[tableView dequeueReusableCellWithIdentifier:CustomCellType2];

        if (!cell) {
            cell = [[CustomCellType2 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CustomCellType2];
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellType2" owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];
        }
        // Do stuff with obj data only needed for this type of cell, perhaps modify the cells subviews
        [cell preConfigureCustomCellType2:obj];
        returnCell = cell;
    } else {
        CustomCellType3 *cell = (CustomCellType3*)[tableView dequeueReusableCellWithIdentifier:StandardMailCell];

        if (!cell) {
            cell = [[CustomCellType3 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:StandardMailCell];
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellType3" owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];
        }
        // Do stuff with obj data only needed for this type of cell perhaps modify the same subviews in a different way for this type of cell
        [cell preConfigureCustomCellType3:mail];
        returnCell = cell;
    }

    if (![tableView isDragging] && !tableView.decelerating) {
             // I used this to only run an expensive operation after the the customer flicks and the table comes to a rest.
    }

    return returnCell;
}
于 2012-10-30T07:42:24.483 回答
0

为什么这些随后出列的单元格具有第一个的内容?

与其每次都重新创建新的单元格,不如重新使用您已经创建的不再显示的单元格。这就是在将单元格出列时实际执行的 tableView 操作:如果可以的话,它会为您提供一些未显示的单元格。

假设您需要显示一个包含 1000 个单元格的 tableview,而 tableView 实际上一次只显示 6 个单元格。它不会创建 1000 个单元格,而是重新使用单元格堆栈,因此不需要重新创建新的单元格。

出队的单元格是指向 UITableViewCell 一个实例的“指针”吗?为什么这些随后出列的单元格具有第一个的内容?

因为它是同一个指针对象,所以它将具有与第一次显示时相同的内容。然后您需要更新其数据。

每次都应该创建一个新的单元格实例吗?可以“克隆”出队的单元格吗?

您只需要创建新单元格,当

[self.tableView dequeueReusableCellWithIdentifier:@"GroupCell"]

什么都不返回。这是一个简单的例子:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 // get your cell from the stack    
GroupCell_iPhone *cell=(GroupCell_iPhone*)[self.tableView dequeueReusableCellWithIdentifier:@"GroupCell"];

 // or create new one if nil. Note: you must give it the same identifier than the
 // one you are using for the dequeue. Or tableview will not be able to return you anything from the dequeing.
if(!cell)
 cell = [GroupCell_iPhone newWithIdentifier: @"GroupCell"] + autorelease];

** 更新**

// here you are sure to have a valid cell, so you can display content according to the indexPath
// display: use a controller who will update your cell change
// note, the first method clean what was inside your cell. You can keep the subview and reuse them the same way as tableview do.
    [myDisplayClassCellController emptyCellSubview: cell];

// here you add all the display logic you want into your cell view. Note, you need indexPath
// because you need to display depending of the stack.
    [myDisplayClassCellController decorateCellWithCustomViews: cell atIndexPath: indexPath];    

**结束更新**

// then you can return back the cell to the tableView
return cell;
}
于 2012-10-29T15:59:46.600 回答