UIDropInteractionDelegate performDrop 没有被调用?

zum*_*zum 7 drag-and-drop uikit ios swift

我正在尝试构建一个简单的测试应用程序来学习拖放 API。对于这个问题,我只关注 Drop 场景。我有一个空白的视图控制器,Safari 应用程序打开(多任务处理)然后我尝试将图像从谷歌拖到视图控制器的视图上。

我可以将图像从 safari 拖到我的应用程序的视图控制器,但是当我放手时,下面的这个调用永远不会被调用:

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

class EditTestVC: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        view.addInteraction(UIDropInteraction(delegate: self))
    }

}

extension EditTestVC:UIDropInteractionDelegate {

    func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool { // 1
        print("canHandle session: \(session)")
        return true
//        return session.canLoadObjects(ofClass: UIImage.self)
    }

    func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal { // 2
        print("sessionDidUpdate session: \(session)")
        return UIDropProposal(operation: .copy)
    }

    func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
        print("performDrop session: \(session)")
    }


}
Run Code Online (Sandbox Code Playgroud)

调用前两个方法,这个:

func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool
Run Code Online (Sandbox Code Playgroud)

和这个:

func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal
Run Code Online (Sandbox Code Playgroud)

所以,我想弄清楚为什么会这样:

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)
Run Code Online (Sandbox Code Playgroud)

永远不会被调用。

有什么建议吗?

Qby*_*yte 5

就我而言,这是一个编程错误,我编写了以下内容:

func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {

    return UIDropProposal(operation: .move)
}
Run Code Online (Sandbox Code Playgroud)

但你不能总是使用move!只要session.allowsMoveOperationtrue

来自移动文档

仅当放置会话的 allowedMoveOperation 属性为 true 时,您才可以使用此操作;否则,它被视为 UIDropOperation.cancel 操作。[...]

取消文档中:

如果用户尝试放置活动,则拖动操作将被取消,并且不会调用 dropInteraction(_:performDrop:) 委托方法


Bha*_*mik 1

我刚刚测试了您的代码,所有方法都被调用。这一定是一个故障。

故障排除步骤:

删除应用程序 -> 重新启动模拟器 -> 清理构建文件夹 -> 重建 -> 运行。您也可以先尝试在不同的模拟器中运行以节省时间。