我有一个带有两个图像视图的表格视图单元格,一个图像视图是占位符,另一个图像之上是我从文档目录加载的实际图像。当表格视图重新使用单元格时,我遇到了图像显示不正确的问题。
我通过在单元类中使用以下方法解决了我的问题,但我已经读到这可能会导致性能问题,有什么更好的解决方案吗?
- (void)prepareForReuse
{
[[self imageView] setImage:nil];
}
我有一个带有两个图像视图的表格视图单元格,一个图像视图是占位符,另一个图像之上是我从文档目录加载的实际图像。当表格视图重新使用单元格时,我遇到了图像显示不正确的问题。
我通过在单元类中使用以下方法解决了我的问题,但我已经读到这可能会导致性能问题,有什么更好的解决方案吗?
- (void)prepareForReuse
{
[[self imageView] setImage:nil];
}
首先,你没有[super prepareForReuse]
像你应该的那样打电话。
而且文档非常清楚,您应该设置图像,tableView:cellForRowAtIndexPath:
因为它是内容。
如果您将图像设置为 in tableView:cellForRowAtIndexPath:
,则无需将其设置为 nil prepareForReuse
。
想象以下流程。
prepareForReuse
将 imageView.image 设置为 niltableView:cellForRowAtIndexPath:
将单元格出列并将 imageView.image 设置为 image1您正在设置 imageView.image 两次。
如果您使用 nil,则可能根本没有可衡量的性能影响。但是您可能会想到实际设置 placeHolder 图像。因此单元格已排队并准备重用,您设置占位符图像;稍后,单元格出列,并且在占位符图像甚至可见之前,占位符图像被真实图像替换。
我会prepareForReuse
完全删除该方法。如果您将图像设置为,则不需要它tableView:cellForRowAtIndexPath:
从文档:
如果一个 UITableViewCell 对象是可重用的——也就是说,它有一个重用标识符——这个方法在对象从 UITableView 方法 dequeueReusableCellWithIdentifier: 返回之前被调用。出于性能原因,您应该只重置与内容无关的单元格属性,例如 alpha、编辑和选择状态。重用单元格时,tableView:cellForRowAtIndexPath: 中的表视图委托应始终重置所有内容。如果单元对象没有关联的重用标识符,则不调用此方法。如果重写此方法,则必须确保调用超类实现。
由于您在此图像视图后面有一个占位符图像,因此将顶部图像视图的图像设置为 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;
}