1

我有一个带有两个图像视图的表格视图单元格,一个图像视图是占位符,另一个图像之上是我从文档目录加载的实际图像。当表格视图重新使用单元格时,我遇到了图像显示不正确的问题。

我通过在单元类中使用以下方法解决了我的问题,但我已经读到这可能会导致性能问题,有什么更好的解决方案吗?

- (void)prepareForReuse
{
    [[self imageView] setImage:nil];
}
4

2 回答 2

2

首先,你没有[super prepareForReuse]像你应该的那样打电话。

而且文档非常清楚,您应该设置图像,tableView:cellForRowAtIndexPath:因为它是内容。
如果您将图像设置为 in tableView:cellForRowAtIndexPath:,则无需将其设置为 nil prepareForReuse

想象以下流程。

  1. 向下滚动,单元格 0 被放入队列中。
  2. prepareForReuse将 imageView.image 设置为 nil
  3. tableView:cellForRowAtIndexPath:将单元格出列并将 imageView.image 设置为 image1

您正在设置 imageView.image 两次。

如果您使用 nil,则可能根本没有可衡量的性能影响。但是您可能会想到实际设置 placeHolder 图像。因此单元格已排队并准备重用,您设置占位符图像;稍后,单元格出列,并且在占位符图像甚至可见之前,占位符图像被真实图像替换。

我会prepareForReuse完全删除该方法。如果您将图像设置为,则不需要它tableView:cellForRowAtIndexPath:


文档

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

于 2013-05-11T18:35:19.810 回答
0

由于您在此图像视图后面有一个占位符图像,因此顶部图像视图的图像设置为 nil 没有任何问题。

为了增强图像生成过程,您可以使用这样的 NSCache 对象,

1)

@property(nonatomic, strong) NSCache *imageCache;


2)在tableView cellForRowAtIndexPath:方法里面调用这个方法,图片生成过程可以移到这个里面,

-(UIImage *) imageForIndexPathRow:(int) row{

    id image = [self.imageCache objectForKey:[NSNumber numberWithInt:row]];

    if(!image){//if the image is not in the cache,

        UIImage *newImage; //create image here

        [self.imageCache setObject:newImage forKey:[NSNumber numberWithInt:row]];

        return newImage;
    }

    return (UIImage *) image;
}
于 2013-05-11T16:15:28.187 回答