没有UITableViewDropDelegate的UITableView的拖放工作

时间:2019-02-27 17:27:06

标签: ios swift uitableview uikit

根据Apple文档支持UITableView的拖放操作,我必须实现UITableViewDragDelegateUITableViewDropDelegate。我只用伪造的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
        }
    }

Example

1 个答案:

答案 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] {

将是有意义的。