Search code examples
swiftxcodeuicollectionviewuicollectionviewcellprepareforreuse

UICollectionViewCell is populated with previous cells data before new the cell's data loads, need to implement PrepareForReuse()


I have a problem with my UICollectionView, The problem is that if you scroll fast enough (not even that fast) the data that was in the cell before the reuse gets displayed for a second or two before the new data gets displayed.

This is the video of it happening for more context (youtube video link): https://youtu.be/I63hBuxBGI0

This is the code inside of the cellForItemAt:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if let post = feedElements[indexPath.row] as? FeedPost {

  let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! feedCollectionViewCell

 
  cell.delegate = self
  cell.post = post
  cell.commentButton.tag =  indexPath.row

  // assigning all of the data 
  cell.captionLabel.text = post.caption
  cell.locationLabel.text = post.location
  cell.timeAgoLabel.text = post.timeAgoString
  cell.setUpElements()
  cell.prepareForReuse()
  return cell
}
}

The code for inside of the numberOfRowsInSection:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return feedElements.count
}

I'm pretty sure what I need to implement is prepareForReuse() but I'm not sure exactly how to do that and couldn't find anything helpful online.

Thanks a lot!


Solution

  • You need to add prepareForReuse in feedCollectionViewCell class like this

    class feedCollectionViewCell: UITableViewCell {
        override func prepareForReuse() {
            super.prepareForReuse()
    
      // Reset your values here as you want ... 
    
            self.post = nil
            self.commentButton.tag =  0
    
            // assigning all of the data
            self.captionLabel.text = nil
            self.locationLabel.text = nil
            self.timeAgoLabel.text = nil
        }
    }