MoveItemAtIndexPath 中的 CollectionView reloadData 有时会导致重复图像
CollectionView reloadData in moveItemAtIndexPath resulting duplicate image sometimes
在我的应用中,目前我们需要在 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 中显示重复的图像,例如
我正在调用 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()
在我的应用中,目前我们需要在 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 中显示重复的图像,例如
我正在调用 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()