在UITableView的scroll事件上保护cell.textLabel.text

时间:2012-02-13 12:47:39

标签: iphone objective-c ios uitableview

如何保护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。

5 个答案:

答案 0 :(得分:1)

他们都将保留他们的UILabels属性,因为单元格被重用,这就是你使用的原因:

[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

然而,UITableView使用延迟加载意味着它只在内存中保留可见的UITableViewCells,因此当您滚动时,现在不可见的单元格会被重用,现在新的可见单元格与您无法再看到的UILabel具有相同的UILabel。这意味着每次只有少数UITableViewCells可以重复使用。

这就是为什么在文档UITableViewCell中讨论实例方法prepareforReuse:

如果UITableViewCell对象是可重用的 - 也就是说,它具有重用标识符 - 在从UITableView方法dequeueReusableCellWithIdentifier:返回对象之前调用此方法:出于性能原因,您应该仅重置与内容无关的单元格属性,例如,alpha,编辑和选择状态。 tableView中的表视图委托:cellForRowAtIndexPath:在重用单元格时应始终重置所有内容。如果单元格对象没有关联的重用标识符,则不会调用此方法。如果重写此方法,则必须确保调用超类实现。

答案 1 :(得分:1)

两个可能的答案:

  1. 一般来说没关系。重用单元格是它应该如何工作的,你应该每次完全“重置”每个单元格。你不应该在单元格中存储状态
  2. 创建一个新的reuseIdentifier,一个用于自定义标签,另一个用于静态文本

答案 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";
}