表视图单元格与图像

时间:2013-05-11 16:02:57

标签: iphone ios objective-c

我有一个包含两个图像视图的表格视图单元格,一个图像视图是占位符,另一个图像顶部是我从文档目录加载的实际图像。当表视图重新使用单元格时,我遇到图像被错误显示的问题。

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

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

2 个答案:

答案 0 :(得分:2)

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

文档非常清楚,您应该在tableView:cellForRowAtIndexPath:中设置图片,因为它是内容 如果您在tableView:cellForRowAtIndexPath:中设置图片,则无法在prepareForReuse中将其设置为nil。

想象一下以下流程。

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

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

    我会完全删除prepareForReuse方法。如果您在tableView:cellForRowAtIndexPath:

    中设置图像,则不需要它

    来自documentation

      

    如果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;
}