在可变数据源tableview上移动tableview单元格

时间:2019-09-09 11:49:10

标签: ios swift uitableview ios13

我使用拖放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

0 个答案:

没有答案