滚动后,可重用的UITableViewCells发生了变化

时间:2014-02-17 14:47:19

标签: ios

UITableviewCell之前的一瞬间,如果图片更新,则会显示重复使用的单元格的图片。有谁知道处理这个问题的最佳做法?

我尝试了以下内容(但可能实施了错误):

  1. prepareForReuse。我试图删除图片,但旧的图像仍然显示仍然闪烁(我可以重写代码并发布,如果有人认为我错过了,它应该有效)
  2. 我尝试了几种缓存图像的方法:仍然不够快
  3. 不重复使用单元格:由于多种原因而不是选项
  4. 图像加载代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            static NSString *CellIdentifier = @"Cell";
    
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
            // Configure the cell...
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            }
    
            UIImageView *pictureImageView = (UIImageView *)[cell viewWithTag:8];
            //Using AFNetworking
            [pictureImageView setImageWithURL:pictureURL];
    
    
            return cell;
        }
    

2 个答案:

答案 0 :(得分:3)

解决方案不是在细胞出现时尝试更改图像,而是在细胞重新使用之前隐藏旧图像。有一种方法可以做到这一点:

-(void) tableView:(UITableView *)tableView didEndDisplayingCell:(BigPictureCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

   UIImageView *pictureImageView = (UIImageView *)[cell viewWithTag:8];
   pictureImageView.image = nil;

}

答案 1 :(得分:0)

我建议你替换这一行:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

这一个:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

和这一个:

pictureImageView.image = [UIImage imageWithColor:O_BACKGROUND_COLOR];

这一个:

pictureImageView.image = nil;

因为从颜色创建UIImage所消耗的不仅仅是删除图像。

并且您不能尝试删除prepareForReuse中的图像,因为在文档中明确指出不应该在此函数中执行布局操作。

修改

您的代码中存在错误:

UIImageView *pictureImageView = (UIImageView *)[cell viewWithTag:8];

这真的很奇怪,因为您之前声明了UITableViewCell nil:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

// Configure the cell...
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

因此,确实无法确保UITableViewCell的{​​{1}}标记为8。 所以,如果不是这里,你应该有其他代码,它可以(当然必须)成为你问题的根源。