ios - UITableViewCell 滚动时显示错误数据

Posted

技术标签:

【中文标题】ios - UITableViewCell 滚动时显示错误数据【英文标题】:ios - UITableViewCell display wrong data when scrolling 【发布时间】:2014-05-21 04:49:20 【问题描述】:

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
static NSString *CellIdentifierNormal = @"CellNormal";
static NSString *CellIdentifierTracking = @"CellTracking";

switch (self.mapState) 
    case MapStateNormal:
    
//            UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierNormal];
//            if (cell == nil) 
            UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierNormal];
//            
        [cell.textLabel setText:@"abc"];
        return cell;
    
    case MapStateTracking:
    
//            UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierTracking];
//            if (cell == nil) 
            UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierTracking];
//            
        if (indexPath.row == 0) 
            [cell.textLabel setText:@"Lorem ipsum"];
         else 
            NSURL *url = [LoremIpsum URLForPlaceholderImageFromService:LoremIpsumPlaceholderImageServicePlaceKittenCom
                                                             withWidth:1024
                                                                height:1024];
            [cell.imageView setImageWithURL:url
                           placeholderImage:[UIImage imageNamed:@"MenuButton"]];
           
        return cell;
    
    default:
        break;

return nil;

这段代码运行良好,但不是最佳实践,因为我每次都重新创建UITableViewCell。显示如下:

但是,当我取消注释上面的这些行以启用 dequeueReusableCell 时,表格会显示其单元格,其中包含类似这样的错误(黄色部分是我的代码):

你可以看到第一行有一个UIImage,下面的一些行有文字,而我显然没有在我的代码中设置它。

我能做些什么来解决这个问题?还是我应该坚持第一种方法?

谢谢。

【问题讨论】:

【参考方案1】:

您确实应该重新使用表格视图单元格,因为如果您一直重新创建它们会产生很多开销,即注释掉的代码是正确的。 接下来,docs 说:“tableView:cellForRowAtIndexPath: 中的表格视图的委托在重用单元格时应该始终重置所有内容。” 如果您不重置内容,它将再次显示。 所以我建议你设置

cell.imageView.image = nil; 

在您的 -(UITableViewCell *)tableView:cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中。

【讨论】:

好的,谢谢。我虽然重置内容是一个自动操作,每次要重用单元格时都会执行。【参考方案2】:

只需为您不想显示任何文本的每个单元格设置[cell.textLabel setText:@""];。单元格与之前的文本重复使用,因此您需要清除它。

【讨论】:

【参考方案3】:

试试这个,如果是cell != nil则清除单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
static NSString *CellIdentifierNormal = @"CellNormal";
static NSString *CellIdentifierTracking = @"CellTracking";

switch (self.mapState) 
    case MapStateNormal:
    
            UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierNormal];
            if (cell == nil) 
                UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierNormal];
             else 
                [cell.textLabel setText:@""];
                [cell.imageView setImage:nil];
            
            ...
        return cell;
    

    case MapStateTracking:
    
            UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifierTracking];
            if (cell == nil) 
                UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierTracking];
             else 
                [cell.textLabel setText:@""];
                [cell.imageView setImage:nil];
            
            ....
        return cell;
    
    default:
        break;

return nil;

【讨论】:

以上是关于ios - UITableViewCell 滚动时显示错误数据的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableviewCell (ios7) 中嵌入的 UITableView 中滚动

iOS7 在 UITableViewCell 中以适当的偏移量编辑 UITextField 时滚动到 UITableViewController 的行

滚动时扭曲 UITableViewCell?

滚动时如何向 UITableViewCell 添加更多按钮?

自动滚动到放置在 UITableViewCell 内的 textView 光标在 iOS11 中不起作用

ios - UITableViewCell 滚动时显示错误数据