При перетаскивании для перемещения ячеек в 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
}