- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现 UICollectionViewDropDelegate
使用 DiffableDataSource(在 iOS 13 中引入)。
UICollectionViewDragDelegate
,这很好用。 collectionView.dropDelegate = self
func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator)
(你甚至可以在方法为空的情况下尝试)。 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView must be updated via the UICollectionViewDiffableDataSource APIs when acting as the UICollectionView's dataSource: please do not call mutation APIs directly on UICollectionView.
最佳答案
这是一个相当容易的解决方案。从 UICollectionViewDropDelegate 函数 performDropWith 开始。请注意,我只需要一个 .move 而不需要 .copy ,但您只需添加一个类似于下面的 reorderItems() 方法的 copyItems() 方法:
func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
var destinationIndexPath: IndexPath
if let indexPath = coordinator.destinationIndexPath {
destinationIndexPath = indexPath
} else {
let section = collectionView.numberOfSections - 1
let row = collectionView.numberOfItems(inSection: section)
destinationIndexPath = IndexPath(row: row, section: section)
}
switch coordinator.proposal.operation {
case .move:
self.reorderItems(coordinator: coordinator, destinationIndexPath: destinationIndexPath, collectionView: collectionView)
break
case .copy:
// Not copying between collections so this block not needed.
return
default:
return
}
}
/// reorderItems method
/// This method moves a cell from the sourceIndexPath to the destinationIndexPath within the same UICollectionView
///
/// - Parameters:
/// - coordinator: UICollectionViewDropCoordinator obtained in performDropWith
/// - destinationIndexPath: IndexPath where user dropped the element.
/// - collectionView: UICollectionView object where reordering is done.
private func reorderItems(coordinator: UICollectionViewDropCoordinator, destinationIndexPath: IndexPath, collectionView: UICollectionView) {
let items = coordinator.items
if items.count == 1, let item = items.first, let sourceIndexPath = item.sourceIndexPath {
var destIndexPath = destinationIndexPath
if destIndexPath.row >= collectionView.numberOfItems(inSection: destIndexPath.section) {
destIndexPath.row = collectionView.numberOfItems(inSection: destIndexPath.section) - 1
}
/// Since my collectionView data is attributed to a Firebase.storage set of data, this is where I write my changes back to the store.
snapshot.moveItem(dataSource.itemIdentifier(for: sourceIndexPath)!, beforeItem: dataSource.itemIdentifier(for: destinationIndexPath)!)
dataSource.apply(snapshot, animatingDifference: true)
coordinator.drop(items.first!.dragItem, toItemAt: destIndexPath)
}
}
关于ios - UICollectionViewDropDelegate 和 DiffableDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699679/
我有一个 Collection View ,将支持 iOS 11 的拖放功能。一个要求是需要通过将单元格拖到 View 底部的垃圾桶上来删除单元格。还有另一种可能性然后使用第二个包含删除符号的 Col
我正在尝试实现 UICollectionViewDropDelegate使用 DiffableDataSource(在 iOS 13 中引入)。 我已经实现 UICollectionViewDragD
我试图在这个狭长的 Collection View 中实现拖放: 它具有水平布局,具有不同大小的单元格和部分。 拖动交互效果很好,但我注意到 UICollectionViewDropDelegate
我正在尝试实现两个 collectionView,并在它们之间拖放单元格。但我在对 collectionView 内的单元格重新排序时遇到了奇怪的行为。这是复制该行为的最少代码。 提供的代码按预期工作
我是一名优秀的程序员,十分优秀!