我在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变量总是正确的。
我做错了什么?
答案 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。