Las imágenes en la colecciónView cambian mientras se desplaza

Estoy trabajando en xcode 8.3. Tengo una CollectionView. Descargué imágenes del service web y coloqué las imágenes en cada una de las celdas CollectionView. Pero cuando desploop el CollectionView, las imágenes en cada celda están cambiando. Después de unos minutos, muestra la image correcta. He intentado muchas soluciones disponibles en stackoverflow. Pero no obtuve una solución. Por favor, ayúdame.

Al igual que los demás dicen que es más probable porque está eliminando celdas reutilizables (como debería ser) y configurando la propiedad cell.imageView.image en su image web.

El problema aquí es que debido a que iOS está guardando en la memory "reutilizando" estas celdas, literalmente son las mismas celdas en la memory. Así que se desplaza por un borde de la pantalla y desaparece. A medida que se desplaza la nueva celda en lugar de crear una nueva celda separada, simplemente usa la que ya tiene que acaba de salir de la pantalla. Lo que significa que su image anterior sigue siendo la que se muestra en la celda.

La práctica estándar es establecer el contenido de la celda en el método cellForRowAtIndexPath: Pero si lo configura en una image que se obtiene de forma asíncrona, es posible (posible) que la celda aparezca en la pantalla con la image anterior antes de que se obtenga la nueva. Es de suponer que una vez que las imágenes se descargan ya no es un problema, ya que deberían volver instantáneamente desde un caching.

La solución simple aquí sería eliminar la image antes de establecerla cada vez en la celda o, preferiblemente, usar una image de marcador de position.

 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CELL_IDENTIFIER" forIndexPath:indexPath]; // This will clear any existing image from the cell about to be displayed it is an option //[cell.imageView setImage:nil]; if (ImageExistsLocally) { cell.imageView.image = [UIImage imageWithContentsOfFile:@"SomeImagePath"]; } else { [cell.cellImageView sd_setImageWithURL:yourRemoteImage.thumbnailUrl placeholderImage:[UIImage imageNamed:PlaceHolderImageName] completed:nil]; } return cell; } 

Tenga en count que sd_setImageWithURL es de la biblioteca SDWebImage que creo que alguien más mencionó aquí. https://cocoapods.org/pods/SDWebImage

Es debido a la reutilización de las células. Intente restablecer la image en el método prepareForReuse de su class de celda

 -(void)prepareForReuse { [super prepareForReuse]; self.imageView.image = nil; } 

El problema al que se enfrenta se debe a la Reutilización de UITableViewCell. Si está descargando imágenes del service web, use AlamofireImage o SDWebImage . Se encargará de su problema.

UICollectionView reutiliza la misma UICollectionViewCell para mejorar el performance. Solo se modifican los datos dentro de UICollectionViewCell , por lo que antes de usar UICollectionViewCell , UICollectionViewCell debe ser borrado de sus datos anteriores. Cocoa Framework proporciona un método que está presente en UICollectionViewCell que se dispara cada vez que se debe reutilizar UICollectionViewCell .

solo reemplace la function que se proporciona a continuación en el file .m de su file de class personalizado UICollectionViewCell

 -(void)prepareForReuse { [super prepareForReuse]; // here we clear the previously set data self.imageView.image = nil; // this will clear the previously set imageView is a property of UIImageView used to display a image data }