收集查看重复单元格时加载更多的数据

问题:

我有一个CollectionView,它将UIimage加载到每个单元格中。 然而,我的问题是,当我加载更多的图像他们似乎重复其他单元格。 我不太明白在我的代码中可能会造成这种情况。 可能是因为可重复使用的单元存在一些问题?

任何人都可以看到为什么会发生?

注意:与图像的数组不重复

问题video: https //www.youtube.com/watch?v = vjRsFc8DDmI

问题的形象:

加载更多数据时,CollectionView具有重复的单元格

这里是我的函数为collectionView:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { //#warning Incomplete method implementation -- Return the number of items in the section if self.movies == nil { return 0 } return self.movies!.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UpcomingCollectionViewCell if self.movies != nil && self.movies!.count >= indexPath.row { // Calc size of cell cell.frame.size.width = screenWidth / 3 cell.frame.size.height = screenWidth / 3 * 1.54 let movies = self.movies![indexPath.row] if(movies.posterPath != "" || movies.posterPath != "null"){ cell.data = movies.posterPath } else{ cell.data = nil } // See if we need to load more movies let rowsToLoadFromBottom = 5; let rowsLoaded = self.movies!.count if (!self.isLoadingMovies && (indexPath.row >= (rowsLoaded - rowsToLoadFromBottom))) { let totalRows = self.movieWrapper!.totalResults! let remainingMoviesToLoad = totalRows - rowsLoaded; if (remainingMoviesToLoad > 0) { self.loadMoreMovies() } } } else { cell.data = nil } return cell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSize(width: screenWidth/3, height: screenWidth/3*1.54) } 

这里我加载了一个Wrapper类的数据:

 func loadFirstMovies() { isLoadingMovies = true Movies.getMovies({ (movieWrapper, error) in if error != nil { // TODO: improved error handling self.isLoadingMovies = false let alert = UIAlertController(title: "Error", message: "Could not load first movies \(error?.localizedDescription)", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } self.addMoviesFromWrapper(movieWrapper) self.activityIndicator.hidden = true self.isLoadingMovies = false self.collectionView.reloadData() }) } func loadMoreMovies(){ self.isLoadingMovies = true if self.movies != nil && self.movieWrapper != nil && self.movieWrapper!.page < self.movieWrapper!.totalPages { // there are more species out there! Movies.getMoreMovies(self.movieWrapper, completionHandler: { (moreWrapper, error) in if error != nil { // TODO: improved error handling self.isLoadingMovies = false let alert = UIAlertController(title: "Error", message: "Could not load more movies \(error?.localizedDescription)", preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) self.presentViewController(alert, animated: true, completion: nil) } print("got more!") self.addMoviesFromWrapper(moreWrapper) self.isLoadingMovies = false self.collectionView.reloadData() }) } } func addMoviesFromWrapper(wrapper: MovieWrapper?) { self.movieWrapper = wrapper if self.movies == nil { self.movies = self.movieWrapper?.results } else if self.movieWrapper != nil && self.movieWrapper!.results != nil { self.movies = self.movies! + self.movieWrapper!.results! } } 

最后我调用: viewDidLoad() loadFirstMovies() viewDidLoad()

编辑: UpcomingCollectionViewCell

 class UpcomingCollectionViewCell: UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! var data:String?{ didSet{ self.setupData() } } func setupData(){ self.imageView.image = nil // reset the image if let urlString = data{ let url = NSURL(string: "http://image.tmdb.org/t/p/w342/" + urlString) self.imageView.hnk_setImageFromURL(url!) } } } 

这是典型的表格视图/集合视图设置问题。

任何时候,如果使用像dequeueReusableCellWithReuseIdentifier:这样的出列方法回收一个单元格,您必须始终完全configuration单元格中的所有视图,包括将所有文本字段/图像视图设置为其初始值。 您的代码有几个if语句,如果if的条件为false,则不会在单元格中设置视图。 如果上次使用单元格时还剩下内容,则需要使用其他子句来清除单元格视图中的旧内容。

**编辑:

改变你的cellForItemAtIndexPath方法开始像这样:

 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UpcomingCollectionViewCell cell.imageView.image = nil; //Remove the image from the recycled cell //The rest of your method ... 

在您的自定义单元格setupData()方法中尝试以下操作:

 func setupData(){ self.imageView.image = nil // reset the image if let urlString = data{ let url = NSURL(string: "http://image.tmdb.org/t/p/w342/" + urlString) self.imageView.hnk_setImageFromURL(url!) } }