Перемещение UICollectionViewCell вызывает ошибку для invalidateItemsAtIndexPaths - PullRequest
0 голосов
/ 21 декабря 2018

При перетаскивании для перемещения ячеек в UICollectionView происходит сбой приложения из-за того, что элементы помечены как недействительные, но затем отсутствуют в пути индекса.

Код успешно подтверждает выполнение перемещения в коллекции.Затем коллекция возвращает ожидаемое количество разделов и ячеек для раздела.После кажущегося завершения без проблем возникает следующая ошибка:

2018-12-20 15: 39: 54.216391-0500 TestApp [1748: 485235] *** Ошибка подтверждения в - [UICollectionViewData invalidateItemsAtIndexPaths:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKitCore/UIKit-3698.93.8/UICollectionViewData.m:166

2018-12-20 15: 39: 54.216878-0500 TestApp [1748: 485235] *** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «попытка аннулировать элемент с недопустимым indexPath: {length = 2, путь = 0 - 1} globalIndex: 1 numItems: 0 '

Сам код ничего интересного не делает.Он гарантирует, что последняя ячейка в режиме редактирования (кнопка добавления) не перемещается, а затем обновляет данные для нашей модели.

Похоже, что ни один из предметов в коллекции не должен быть признан недействительным в первую очередь.Количество элементов в коллекции довольно мало, поэтому все время отображается на экране, поэтому в этом сценарии не удаляются ячейки.Никакое содержимое ни для одной из ячеек не было изменено, поэтому я не совсем уверен, что могло быть помечено как недействительное, но даже если это произойдет, я не знаю, почему это будет отсутствовать.

Код ниже:

// MARK: UICollectionViewDataSource Functions

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    let friendsCount = AppDataModel.sharedInstance.groupModels[groupIndex!].friends.count
    if friendsCount >= 0 {
        return isEditingEnabled ? friendsCount + 1 : friendsCount
    } else {
        return 0
    }
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if isEditingEnabled && indexPath.row == AppDataModel.sharedInstance.groupModels[groupIndex!].friends.count {

        if !isUpgraded {
            var currentVideoCount = 0
            for i in 0..<AppDataModel.sharedInstance.groupModels.count {
                currentVideoCount += AppDataModel.sharedInstance.groupModels[i].friends.count
            }
            if currentVideoCount >= maxFreeVideos {
                print("Max Videos for trial reached.")
                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "upgradeCell", for: indexPath)
                return cell
            }
        }

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "addFriendCell", for: indexPath)
        return cell
    }
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "friendCell", for: indexPath) as! MainViewFriendCollectionViewCell
    let friendForCell = AppDataModel.sharedInstance.groupModels[groupIndex!].friends[(indexPath as NSIndexPath).row]
    cell.setup(friendForCell, shouldHideDeleteButton: !isEditingEnabled, onDeleteFriend: self.onDeleteFriend, onForceUpload: self.onForceUpload)
    return cell
}

func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    // The user cannot reorder the add button
    let addButtonIndex = AppDataModel.sharedInstance.groupModels[groupIndex!].friends.count
    let destinationIndex = (destinationIndexPath.item >= addButtonIndex) ? addButtonIndex - 1 : (destinationIndexPath as NSIndexPath).item
    // reflect the changes to the view in the model
    AppDataModel.sharedInstance.groupModels[groupIndex!].updateFriendOrdersAfterReorder((sourceIndexPath as NSIndexPath).item, toIndex: destinationIndex)
}

func collectionView(_ collectionView: UICollectionView, targetIndexPathForMoveFromItemAt originalIndexPath: IndexPath, toProposedIndexPath proposedIndexPath: IndexPath) -> IndexPath {
    let addButtonIndex = AppDataModel.sharedInstance.groupModels[groupIndex!].friends.count
    return proposedIndexPath.item >= addButtonIndex ?  originalIndexPath : proposedIndexPath
}
...