Если вы делаете изменения с collectionView.performBatchUpdates () для обновления вашего collectionView, это будет sh, кажется, вам нужно создать моментальный снимок на вашем источнике данных (UICollectionViewDiffableDataSource), который, как вы можете прочитать, указан в сообщении об ошибке: «API UICollectionViewDiffableDataSource при работе в качестве источника данных UICollectionView: пожалуйста, не вызывайте API мутации непосредственно в UICollectionView»
Попробуйте:
// MARK: - Properties
var dataSource: UICollectionViewDiffableDataSource<Int, UIImage>?
var entry: Entry? {
didSet {
guard let entry = entry else { return }
let dateFormatter = DateFormatter()
dateFormatter.setLocalizedDateFormatFromTemplate("MMM dd yyyy, hh:mm")
title = dateFormatter.string(from: entry.dateCreated)
}
}
, где ваша запись представляет собой структуру:
struct Entry {
let id = UUID().uuidString
let dateCreated = Date()
var log: String?
var images: [UIImage] = []
var isFavorite: Bool = false
}
extension Entry: Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(dateCreated)
hasher.combine(log)
}
static func == (lhs: Entry, rhs: Entry) -> Bool {
return lhs.dateCreated == rhs.dateCreated &&
lhs.log ?? "" == rhs.log ?? "" &&
lhs.images == rhs.images &&
lhs.isFavorite == rhs.isFavorite
}
}
И reloadSnapshot:
private func reloadSnapshot(animated: Bool) {
var snapshot = NSDiffableDataSourceSnapshot<Int, UIImage>()
snapshot.appendSections([0])
snapshot.appendItems(entry?.images ?? [])
dataSource?.apply(snapshot, animatingDifferences: animated)
}
Наконец, на вашем UICollectionViewDropDelegate:
func collectionView( _ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
let destinationIndex = coordinator.destinationIndexPath?.item ?? 0
for item in coordinator.items {
if coordinator.session.localDragSession != nil,
let sourceIndex = item.sourceIndexPath?.item {
self.entry?.images.remove(at: sourceIndex)
}
item.dragItem.itemProvider.loadObject(ofClass: UIImage.self) {
(object, error) in
guard let image = object as? UIImage, error == nil else {
print(error ?? "Error: object is not UIImage")
return
}
DispatchQueue.main.async {
self.entry?.images.insert(image, at: destinationIndex)
self.reloadSnapshot(animated: true)
}
}
}
}
Я все это основываюсь на чтении и работе с raywenderlich.com "Catalyst by Tutorials «