UITableViewCell过早地重复使用

时间:2013-08-17 04:32:03

标签: ios objective-c

我在indexPath.section == 3 && indexPath.row == 3时有一个条件断点。第一次触发断点,然后运行

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

该单元格与indexPath.section == 0 && indexPath.row == 0处的单元格相同,而不是nil,这正是我所期望的。我确保第3部分的行数为4.为什么不是单元格nil

3 个答案:

答案 0 :(得分:0)

我只是给你一个建议,如果你想对细胞的可重用性给予限制,请按照我的下面的答案,但我想在这里提示这是不好的用于内存管理。

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

    NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

         /// Put your code here.
     }

      /// Put your code here.

    return cell;
}

答案 1 :(得分:0)

UITableView不一定用第一行开始绘图。它可以在任何地方开始绘制,具体取决于在给定时间需要绘制视图的哪个部分。

dequeueReusableCellWithIdentifier:方法只会返回nil一次。之后,它将永远返回之前用于其他行的单元格。

如果您有两行具有不兼容的单元格,则每个行都需要具有不同的标识符。例如,您的案例中每个部分都应该有一个标识符。

关键是如果你绘制了几千个看起来几乎相同的表视图行,除了文本可能不同,那么你可以创建一个单元格,然后更改文本但保留其他所有内容(字体,附件视图,等等,它完全相同,并绘制每一个。

答案 2 :(得分:0)

而不是[tableView dequeueReusableCellWithIdentifier:CellIdentifier];,请使用

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:CELL_IDENTIFIER];

...

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

没有检查nil单元格。