如何解决在uicollectionview中移动多个项目有时会崩溃的问题?

时间:2019-01-14 12:07:57

标签: ios swift uicollectionview

我有一个带有几个部分的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]

}

2 个答案:

答案 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来表示中间状态(集合视图单元的某些部分已更改,但并非所有更改都已提交)。