2

当单元格第一次变得可见时,将使用 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 的单元格?

4

1 回答 1

3

UITableView dequeueReusableCellWithIdentifier方法将为您处理。如果您使用它,它将仅对可见单元格而不是所有 200 个单元格进行 dequestatic [iTableView dequeueReusableCellWithIdentifier:cellIdentifier];

这是来自苹果讨论线程的讨论。也检查一下。

更新: 您需要修改您的单元格标识符。如果您为每一行创建新的 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;

更新2:如果你不使用ARC,应该是,

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

你需要有一个autorelease相同的。

于 2012-10-13T05:22:13.870 回答