当单元格第一次变得可见时,将使用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的单元格?
答案 0 :(得分:3)
UITableView
dequeueReusableCellWithIdentifier
方法会为您处理。如果您使用static [iTableView dequeueReusableCellWithIdentifier:cellIdentifier];
以下是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
。