根据Apple文档支持UITableView
的拖放操作,我必须实现UITableViewDragDelegate
和UITableViewDropDelegate
。我只用伪造的UITableViewDragDelegate
实现了tableView(_:itemsForBeginning:at:)
(它返回空列表)。但是此解决方案有效。
为什么起作用?
import UIKit
class TableViewController: UITableViewController, UITableViewDragDelegate {
var data = [1, 2, 3, 4, 5]
// MARK: - Table view drag delegate
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
// fake implementation with empty list
return []
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "Cell \(data[indexPath.row])"
return cell
}
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let tmp = data[sourceIndexPath.row]
data.remove(at: sourceIndexPath.row)
data.insert(tmp, at: destinationIndexPath.row)
}
// MARK: - View controller
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.dragInteractionEnabled = true
self.tableView.dragDelegate = self
}
}
答案 0 :(得分:0)
它不起作用。您所看到的不是拖放。
您正在使用“重新排序控件”看到行重新排列。该机制非常古老;它在创建拖放之前已经存在了很多年。那就是您实施
的效果override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
这是一个UITableViewDataSource方法;它与拖放无关。参见:
https://developer.apple.com/documentation/uikit/uitableviewdatasource/1614867-tableview
如果删除该方法,旧的行重排机制将停止运行,现在您将使用拖放操作和
的实现func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
将是有意义的。