我正在尝试使tableView cells
可移动,但是它需要UITableViewDataSource
协议中的2或3个函数,如果我尝试在viewController
中实现委托,它将要求{新的numberOfRowsInSection
已涵盖了{1}}和cellForRowAtIndexPath
函数。
在使用新的UITableViewDiffableDataSource
时如何实现此行为?
答案 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…)
,但似乎没有任何害处。