Как исправить перемещение нескольких элементов в uicollectionview, иногда сбой? - PullRequest
0 голосов
/ 14 января 2019

У меня есть 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 голосов
/ 14 января 2019

Для перемещения, вставки или удаления нескольких элементов при анимации изменений необходимо использовать performBatchUpdates в представлении коллекции. Читайте об этом в документации Apple .

Это гарантирует, что ваше окончательное состояние может быть согласовано с вашим UICollectionViewDataSource. В противном случае очень сложно представить промежуточные состояния (где изменились части ваших ячеек представления коллекции, но не все изменения зафиксированы) с помощью UICollectionViewDataSource.

.
0 голосов
/ 14 января 2019

Вы должны отсортировать выбранные элементы в порядке убывания item. Если перед перемещением более высокого элемента переместить элемент меньшего размера, размер исходного массива уменьшится, что приведет к исключению потенциальных границ.

if let selected = collectionView!.indexPathsForSelectedItems {

    let sortedSelected = selected.sorted {
        return $0.item > $1.item
    }

    for indexPath in sortedSelected {
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...