我使用拖放API来实现单元移动。它在UITableViewDataSource
下工作。但是,使用新的UITableViewDiffableDataSource
会在单元格下降到新位置时导致应用程序崩溃。
一些代码示例:
private func configureDataSource() -> UITableViewDiffableDataSource<Section, Item> {
return ItemTableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item -> UITableViewCell? in
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ItemTableViewCell.self), for: indexPath) as! ItemTableViewCell
ViewController.configure(cell, with: item)
return cell
}
}
// MARK: - UITableViewDragDelegate
extension ViewController: UITableViewDragDelegate {
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
return [UIDragItem(itemProvider: NSItemProvider())]
}
func tableView(_ tableView: UITableView, dragPreviewParametersForRowAt indexPath: IndexPath) -> UIDragPreviewParameters? {
let parameters = UIDragPreviewParameters()
parameters.backgroundColor = .clear
return parameters
}
}
// MARK: - UITableViewDropDelegate
extension ViewController: UITableViewDropDelegate {
func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UITableViewDropProposal {
guard let dragSession = session.localDragSession else {
return UITableViewDropProposal(operation: .cancel, intent: .unspecified)
}
// drag in same app
return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
}
func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
}
}
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView must be updated via the UITableViewDiffableDataSource APIs when acting as the UITableView's dataSource: please do not call mutation APIs directly on UITableView. <UITableView: 0x11a054200; frame = (0 0; 375 812); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x28016a880>; layer = <CALayer: 0x280f2e6c0>; contentOffset: {0, -88}; contentSize: {375, 495}; adjustedContentInset: {88, 0, 34, 0}; dataSource: <_TtGC12DNDOrderList31ItemTableViewDiffableDataSourceOCS_14ViewController7SectionCS_4Item_: 0x280d10a40>>'
*** First throw call stack:
(0x1b0663278 0x1b038c0a4 0x1b05658a8 0x1b099b2dc 0x1b4805758 0x1b481c6f0 0x1b47df2c8 0x1b40f96d4 0x1b4112f2c 0x1b4118688 0x100a42c88 0x100a460ac 0x1b570f210 0x1b570eedc 0x1b570f404 0x1b05e1090 0x1b05e0fe8 0x1b05e0780 0x1b05db8cc 0x1b05db16c 0x1ba405328 0x1b4643f6c 0x10097044c 0x1b0466424)
libc++abi.dylib: terminating with uncaught exception of type NSException