使用UITableViewDiffableDataSource时如何移动UITableView单元格?

时间:2019-08-15 13:45:19

标签: ios swift uitableview uikit

我正在尝试使tableView cells可移动,但是它需要UITableViewDataSource协议中的2或3个函数,如果我尝试在viewController中实现委托,它将要求{新的numberOfRowsInSection已涵盖了{1}}和cellForRowAtIndexPath函数。

在使用新的UITableViewDiffableDataSource时如何实现此行为?

2 个答案:

答案 0 :(得分:1)

我可以通过如下子类化beamer类来做到这一点:

UITableViewDiffableDataSource

然后您可以class MyDataSource: UITableViewDiffableDataSource<Int, Int> { override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { // your code here } } 实现所需的任何数据源方法。

答案 1 :(得分:1)

要充实Tung Fam的答案,下面是一个完整的实现:

class MovableTableViewDataSource: UITableViewDiffableDataSource<Int, Int> {

    override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        super.tableView(tableView, moveRowAt: sourceIndexPath, to: destinationIndexPath)

        var snapshot = self.snapshot()
        if let sourceId = itemIdentifier(for: sourceIndexPath) {
            if let destinationId = itemIdentifier(for: destinationIndexPath) {
                guard sourceId != destinationId else {
                    return // destination is same as source, no move.
                }
                // valid source and destination
                if sourceIndexPath.row > destinationIndexPath.row {
                    snapshot.moveItem(sourceId, beforeItem: destinationId)
                } else {
                    snapshot.moveItem(sourceId, afterItem: destinationId)
                }
            } else {
                // no valid destination, eg. moving to the last row of a section
                snapshot.deleteItems([sourceId])
                snapshot.appendItems([sourceId], toSection: snapshot.sectionIdentifiers[destinationIndexPath.section])
            }
        }

        apply(snapshot, animatingDifferences: false, completion: nil)
    }
}

如果将animatingDifferences设置为true,则会崩溃(无论如何,动画在这里并不是很理想)。

我不确定是否需要致电super.tableView(move…),但似乎没有任何害处。