moveItemAtIndexPath中的CollectionView reloadData有时会产生重复的图像

时间:2016-09-08 13:10:28

标签: ios swift uicollectionview ios9

  • 在我的应用程序中,我们需要在collectionView中重新排序图像,collectionView的第一个图像应该反映在imageView上,所以这是我的实现

    //MARK: Variable declaration
    
     @IBOutlet var imageViewMain: UIImageView!
     @IBOutlet var collectionViewImages: UICollectionView!
     var listingImages : [UIImage] = [UIImage(named:"demo_advertisement")!, UIImage(named:"camera_black")!, UIImage(named:"twitter-bird-logo")!, UIImage(named:"money-bag")!]
    
     //MARK: DataSource
    
       func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
      {
    
        let addPhotosCell = collectionView.dequeueReusableCellWithReuseIdentifier("AddPhototsCollectionViewCell", forIndexPath: indexPath) as! AddPhototsCollectionViewCell
        addPhotosCell.imageView.image = listingImages[indexPath.item]
    
        //        if listingImages.count > 0 {
        //            imageViewMain.image = listingImages[0]
        //        }
    
        return addPhotosCell
      }
    
      func collectionView(collectionView: UICollectionView, moveItemAtIndexPath sourceIndexPath: NSIndexPath,toIndexPath destinationIndexPath: NSIndexPath) {
    
        // swap values if sorce and destination
        let src = listingImages[sourceIndexPath.row]
        let dest = listingImages[destinationIndexPath.row]
        listingImages[destinationIndexPath.row] = src
        listingImages[sourceIndexPath.row] = dest        
    
        self.collectionViewImages.performBatchUpdates({
    
            self.collectionViewImages.reloadData()
    
            }, completion: nil)
    
    }
    

我想要实现的目标:

  • collevtionView的第一个元素应显示在imageViewMain
  • 重新排序collectionView图像(我在ColletionView上使用长按手势完成此操作)

问题:

如果我这样做

   self.collectionViewImages.reloadData()

在moveItemAtIndexPath中重新排序图像时,它显示了像

这样的重复图像

enter image description here

我正在调用reloadData(),因为我需要在cellForItemAtIndexPath中将collectionView的第一个元素设置为imageViewMain。

我的尝试:如果我没有调用reloadData并尝试将图像设置为moveItemAtIndexPath中的imageViewMain

    imageViewMain.image = listingImages[0]  

在下面的行之后,它将无法在imageViewMain上正确反映。(但在这种情况下,图像重新排序完美无需任何重复图像)

    let src = listingImages[sourceIndexPath.row]
    let dest = listingImages[destinationIndexPath.row]
    listingImages[destinationIndexPath.row] = src
    listingImages[sourceIndexPath.row] = dest    

任何人都可以建议我实施这个的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

添加

 addPhotosCell.imageView.image = nil
cellForItemAtIndexPath正好在dequeueReusableCellWithReuseIdentifier下方的

我的意思是它应该是cellForItemAtIndexPath的第二行。

现在,为什么会这样?答案是集合视图dequeue单元格和resue它的内存效率和更好的性能。所以有时你没有得到新的图像然后显示前一个图像因为图像没有被覆盖!!

因此,您必须将单元格的imagview设置为nil,否则您必须设置一些placeholder image,如果您没有图像可以显示!

答案 1 :(得分:2)

实际上是我用

写的逻辑
moveItemAtIndexPath

错了。而不是

let src = listingImages[sourceIndexPath.row]
let dest = listingImages[destinationIndexPath.row]
listingImages[destinationIndexPath.row] = src
listingImages[sourceIndexPath.row] = dest  

应该是

let src = listingImages[sourceIndexPath.row]
listingImages.removeAtIndex(sourceIndexPath.row)
listingImages.insert(src, atIndex: destinationIndexPath.row)
collectionViewImages.reloadData()