MoveItemAtIndexPath 中的 CollectionView reloadData 有时会导致重复图像

CollectionView reloadData in moveItemAtIndexPath resulting duplicate image sometimes

我想要实现的目标:

问题:

如果我这样做

   self.collectionViewImages.reloadData()

在重新排序图像时在 moveItemAtIndexPath 中显示重复的图像,例如

我正在调用 reloadData(),因为我需要将 collectionView 的第一个元素设置为 cellForItemAtIndexPath 中的 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    

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

添加

 addPhotosCell.imageView.image = nil

cellForItemAtIndexPath 正下方 dequeueReusableCellWithReuseIdentifier 我的意思是它应该是 cellForItemAtIndexPath.

的第二行

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

因此,您必须将单元格的 imagview 设置为 nil,或者您必须设置一些 placeholder image,以便在没有图像时可以显示!

实际上我写的逻辑是

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()