如何保护UITableViewCell的文本,在UITableView的滚动时会更改。
static NSString *CellIdentifier = @"Cell";
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(indexPath.row != [destinationList count])
{
if (cell == nil)
{
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.customLable.text = @"MyCustomLabel";
else
{
if (cell == nil)
{
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"Static Text to be set";
[cell.customLable removeFromSuperview];
}
问题:每次滚动UITableView时,@“MyCustomLabel”都会覆盖@“要设置的静态文本”。
我该怎样防止这种情况?我希望UITableView的所有单元格都能通过Table的LifeTime保留TextLabel。
答案 0 :(得分:1)
他们都将保留他们的UILabels属性,因为单元格被重用,这就是你使用的原因:
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
然而,UITableView使用延迟加载意味着它只在内存中保留可见的UITableViewCells,因此当您滚动时,现在不可见的单元格会被重用,现在新的可见单元格与您无法再看到的UILabel具有相同的UILabel。这意味着每次只有少数UITableViewCells可以重复使用。
这就是为什么在文档UITableViewCell中讨论实例方法prepareforReuse:
如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 在从UITableView方法dequeueReusableCellWithIdentifier:返回对象之前调用此方法:出于性能原因,您应该仅重置与内容无关的单元格属性,例如,alpha,编辑和选择状态。 tableView中的表视图委托:cellForRowAtIndexPath:在重用单元格时应始终重置所有内容。如果单元格对象没有关联的重用标识符,则不会调用此方法。如果重写此方法,则必须确保调用超类实现。
答案 1 :(得分:1)
两个可能的答案:
答案 2 :(得分:0)
您应该为不同的单元格制作不同的标识符。 无论如何,在UITableView中存储东西是一种错误的方法,它只是为了显示数据,而不是存储。
答案 3 :(得分:0)
为什么要删除自定义标签?只需删除标签文本即可。
if(indexPath.row != [destinationList count])
{
/* ... */
cell.textLabel.text = @"";
cell.customLable.text = @"MyCustomLabel";
else
{
/* ... */
cell.textLabel.text = @"Static Text to be set";
cell.customLable.text = @"";
}
并确保标签是透明的。
答案 4 :(得分:0)
试试这个
static NSString *CellIdentifier = @"Cell";
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = nil;
cell.customLabel.text = nil;
if(indexPath.row != [destinationList count])
{
cell.customLable.text = @"MyCustomLabel";
}
else
{
cell.textLabel.text = @"Static Text to be set";
}