UICollectionViewCell显示错误的图像

时间:2017-01-13 15:06:16

标签: ios objective-c uicollectionviewcell

我在UICollectionViewCells中有一个带UIImageView的UICollectionView。 我用这个来实现:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];

    int index = (int)indexPath.row;
    NSString* image = [imagesUri objectAtIndex:index];

    if( [recipeImageView image] == nil){
        UIImage* img = [UIImage imageWithContentsOfFile:image];
        recipeImageView.contentMode = UIViewContentModeScaleAspectFit;
        recipeImageView.image = img;
    }

    return cell;
}

一切正常,但滚动时,单元格内的图像是错误的。调试我发现img变量总是正确的。

我做错了什么?

3 个答案:

答案 0 :(得分:4)

如果你继承了UICollectionViewCell(你真的应该,并将一些代码移出视图控制器),你可以覆盖perpareForReuse并在单元格之前设置imageView.image = nil再次使用。

答案 1 :(得分:0)

因为您正在重复使用单元格,所以一旦设置了recipeImageView,您就不会覆盖它 - 只有在recipeImageView.image == nil时才设置图像,并且仅在第一次加载。

每次加载单元格时,都需要使用新值设置图像。

答案 2 :(得分:0)

我怀疑显示错误图像的原因是因为if( [recipeImageView image] == nil)条件在重复使用前一个单元格时返回false。当重复使用前一个单元格(例如第1行的单元格)时(第10行),它将包含带有图像(来自第1行)且不是nil的imageView。因此,上面的if条件返回false,并且图像(第10行)不会使用新图像进行更新。

建议的解决方案:删除if条件并始终使用新图像更新imageView。