UITableView删除所有可重用的单元格

时间:2012-10-13 05:12:07

标签: objective-c ios uitableview

当单元格第一次变得可见时,将使用init方法。 当单元格第一次变得可见时,它将从表格​​视图的内存中出列。

UITableViewCell *cell = [searchTable dequeueReusableCellWithIdentifier:identifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
}
return cell;

假设我已经滚动整个表格,现在任何单元格都可以出列,因为它们都已经初始化了。

我当前的单元格有0到199之间的标识符。我刷新了表格视图,现在我有了新的单元格信息。我使用方法reloadData,并通过将+200添加到单元格标识符,使用200到399的标识符来表示新单元格:

NSInteger index = indexPath.row + 200;
NSString *CellIdentifier = [NSString stringWithFormat:@"%d",index];

现在我滚动整个表格并查看200到399的单元格。

让我们想象一下,我将index改回:

NSInteger index = indexPath.row;

现在提出一个问题:标识符从0到199的旧单元格仍然可以出列,不是吗?

如果答案是They CAN be dequeued,我还有另一个问题:

当我开始使用标识符为200到399的单元格时,是否有办法从表格视图内存中删除标识符为0到199的单元格?

1 个答案:

答案 0 :(得分:3)

UITableView dequeueReusableCellWithIdentifier方法会为您处理。如果您使用static [iTableView dequeueReusableCellWithIdentifier:cellIdentifier];

,它将仅显示可见细胞而不是所有200个细胞

以下是apple discussion thread对此的讨论。检查一下。

<强>更新     您需要修改您的小区标识符。如果要为每一行创建新的CellIdentifier,则使用dequeueReusableCellWithIdentifier没有意义,因为标识符每次都不同。

而不是

NSString *CellIdentifier = [NSString stringWithFormat:@"%d",index];

应该是,

static NSString *CellIdentifier = [NSString stringWithString@"cell"];

这意味着一旦不可见,每个单元格都将被重用。它只会选择不可见的单元格,并将其重新用于下一组显示的单元格。根据你的实现,它将创建300或400个单元格,你不能删除以前的单元格,因为你不再有任何引用它们。

您的方法将如下所示,

static NSString *CellIdentifier = [NSString stringWithString@"cell"];
UITableViewCell *cell = [searchTable dequeueReusableCellWithIdentifier:Cellidentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier];
}
cell.textLabel.text = @"something";
//...
return cell;

Update2:如果您不使用ARC,则应该是

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:Cellidentifier] autorelease]; 

你需要有一个autorelease