如何在iOS 11上使用拖放功能移动多个UITableView行?

pexxcrt2  于 2023-02-20  发布在  iOS
关注(0)|答案(1)|浏览(120)

在iOS 11上,通过拖放将一个UITableView行移动到另一个索引路径非常容易。但我找不到通过拖放移动多行的方法。我实现了所有需要的委托方法,但UITableView视图仍然不会为多行拖放打开间隙,并且tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator)从未被调用。
下面是我对UITableViewDropDelegateUITableViewDragDelegate的实现。

func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
    let itemProvider = NSItemProvider(item: nil, typeIdentifier: nil)
    let dragItem = UIDragItem(itemProvider: itemProvider)

    return [dragItem]
}

func tableView(_ tableView: UITableView, itemsForAddingTo session: UIDragSession, at indexPath: IndexPath, point: CGPoint) -> [UIDragItem] {
    let itemProvider = NSItemProvider(item: nil, typeIdentifier: nil)
    let dragItem = UIDragItem(itemProvider: itemProvider)

    return [dragItem]
}

func tableView(_ tableView: UITableView, canHandle session: UIDropSession) -> Bool {
    return true
}

func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UITableViewDropProposal {
    return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
}

func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
    ...
}

启用拖放,同时设置代理。

tableView.dragDelegate = self
tableView.dropDelegate = self
tableView.dragInteractionEnabled = true
4xrmg8kj

4xrmg8kj1#

我可以通过一些技巧使它工作。诀窍是记住行选择,但不实际选择行。下面是我在didSelectRow委托回调中所做的:

let cell = tableView.cellForRow(at: indexPath)
        tableView.deselectRow(at: indexPath, animated: true)
        guard let imageView = cell?.accessoryView as? UIImageView else { return }
        if isSelected(indexPath: indexPath) {
            imageView.image = UIImage(systemName: "circle")
            removeSelected(indexPath: indexPath)
        } else {
            imageView.image = UIImage(systemName: "checkmark.circle.fill")
            selectedItems.append(indexPath)
        }

selectedItems是一个全局IndexPath数组,其中包含一些帮助器方法。
现在在itemsForBeginning调用中,我有以下代码:

func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
    let itemProvider = NSItemProvider()
    
    var dragItems: [UIDragItem] = []
    if isSelected(indexPath: indexPath) == false {
        selectedItems.append(indexPath)
    }
    for item in selectedItems {
        let dragItem = UIDragItem(itemProvider: itemProvider)
        dragItem.localObject = item
        dragItems.append(dragItem)
    }
    return dragItems
}

在performDropWith中,我得到了以下内容:

func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
    guard let draggedItems = coordinator.session.localDragSession?.items else { return }
    guard let destinationPath = coordinator.destinationIndexPath else { return }

    selectedItems = []
    for draggedItem in draggedItems {
        guard let item = draggedItem.localObject as? IndexPath  else { continue }
        // do whatever you want to do
    }
}

一切都按预期工作。唯一令人讨厌的部分是,拖动动作正确显示计数,但只动画启动拖动的行,而不是所有行。

相关问题