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