我有一个带有几个部分的UICollectionView。收集视图允许用户将多个项目从一个部分移动到另一部分。它的工作方式是用户选择项目,点击“移动”并选择新部分。
下面的函数进行移动。当只选择一项时,它工作得很好,而当选择了几项时,它有时会工作。但是,移动多个项目时,它有时会崩溃。崩溃发生在pictureforItemAtIndexPath函数中,原因是我的dataArray超出范围(dataArray是向集合视图提供数据的数组)。
我不确定什么是错误的,以及为什么有时会出错。
func movePictures(newCategory: String) {
if let selected = collectionView!.indexPathsForSelectedItems {
for indexPath in selected {
print("IndexPath is: \(indexPath)")
let currentPicture = dataSource.pictureForItemAtIndexPath(indexPath: indexPath)
currentPicture.pictureCategory = newCategory
let newSectionNumber = dataSource.getSectionNumber(sectionName: newCategory)
let newIndexPath = dataSource.getNewIndexPath(sectionNumber: newSectionNumber)
dataSource.moveItemAtIndexPath(from: indexPath, to: newIndexPath)
collectionView.moveItem(at: indexPath, to: newIndexPath)
}
self.deselectAllItems()
}
}
func pictureForItemAtIndexPath(indexPath: IndexPath) -> Picture {
return dataArray[indexPath.section][indexPath.item]
}
答案 0 :(得分:0)
您应按item
降序对所选项目进行排序。如果在移动较高的项目之前先移动较低的项目,则源数组的大小将减小,从而导致潜在的边界异常。
if let selected = collectionView!.indexPathsForSelectedItems {
let sortedSelected = selected.sorted {
return $0.item > $1.item
}
for indexPath in sortedSelected {
...
答案 1 :(得分:0)
要在为更改添加动画效果时移动,插入或删除多个项目,需要在集合视图上使用performBatchUpdates
。在Apple documentation中进行阅读。
这可确保您的最终状态可以与您的UICollectionViewDataSource
保持一致。否则,很难用UICollectionViewDataSource
来表示中间状态(集合视图单元的某些部分已更改,但并非所有更改都已提交)。