Ios UICollectionViewCell显示错误的图像

Ios UICollectionViewCell显示错误的图像,ios,objective-c,uicollectionviewcell,Ios,Objective C,Uicollectionviewcell,在UICollectionViewCells中有UICollectionView和UIImageView。 我用这个来宣传: - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView dequeueReus

在UICollectionViewCells中有UICollectionView和UIImageView。 我用这个来宣传:

- (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变量总是正确的


我做错了什么?

因为您正在重复使用单元格,一旦设置了recipeImageView,您就不会覆盖它-您只会在recipeImageView.image==nil时设置图像,这只是第一次加载


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

因为您正在重用单元格,一旦设置了recipeImageView,您就不会覆盖它-您只会在recipeImageView.image==nil时设置图像,而这只是在第一次加载时


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

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


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

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


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

如果您将
UICollectionViewCell子类化(确实应该,并将部分代码移出视图控制器),在再次使用单元格之前,您可以覆盖
perpareForReuse
,并设置
imageView.image=nil

如果将
UICollectionViewCell
子类化(确实应该,并将部分代码移出视图控制器),在再次使用单元格之前,您可以覆盖
perpareForReuse
,并设置
imageView.image=nil

我添加了它,因为图像太多,卷轴变得不太流畅。。如何保持滚动流畅?您可以将图像加载到viewDidLoad上的内存中,并将UIImage对象保留在数组中。使滚动变慢的是,您每次都从文件中加载图像。如果在您的手机上调用了didReceiveMemoryWarning,请记住清除图像UIViewController@Pol,您可以使用完全适合帧容器的图像,因为小图像加载速度更快(拇指图像),也可以使用异步队列在显示之前将图像读取到ram中,当然,这是一个好的开始。另外,请阅读惰性加载的概念,并思考如何将其应用于具体问题。我之所以添加惰性加载,是因为有了大量图像,卷轴的流动性变小了。。如何保持滚动流畅?您可以将图像加载到viewDidLoad上的内存中,并将UIImage对象保留在数组中。使滚动变慢的是,您每次都从文件中加载图像。如果在您的手机上调用了didReceiveMemoryWarning,请记住清除图像UIViewController@Pol,您可以使用完全适合帧容器的图像,因为小图像加载速度更快(拇指图像),也可以使用异步队列在显示之前将图像读取到ram中,当然,这是一个好的开始。另外,请阅读延迟加载的概念,并思考如何将其应用于具体问题。如果未将图像正确设置到imageview,则仅当imageview不包含图像时,它才会分配图像。如果已分配其他图像,则会出现这种情况。否则会是什么情况?如果您有特定的要求,请将其写入,这样就可以了。如果您没有将图像正确设置到imageview,则仅当imageview不包含图像时,它才会指定该图像。否则,如果已指定其他图像,则会显示该图像。否则会发生什么情况?如果你有一定的要求,写下来就可以了。