UIDropInteractionDelegate performDrop 没有被调用?

Posted

技术标签:

【中文标题】UIDropInteractionDelegate performDrop 没有被调用?【英文标题】:UIDropInteractionDelegate performDrop not called? 【发布时间】:2019-07-15 23:12:27 【问题描述】:

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

我可以将图像从 safari 拖到我应用的 View Controller 中,但是当我放手时,下面的这个调用永远不会被调用:

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)

这是我的代码:

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)")
    



上面的两个方法被调用,这个:

func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool

还有这个:

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

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

func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession)

永远不会被调用。

有什么建议吗?

【问题讨论】:

您是否尝试过延迟等待?有时加载对象需要时间。此外,用户必须确认他们删除项目的意图,因此可能会在视图控制器视图上保持对象一段时间。 我刚刚测试了你的代码,所有的方法都被调用了。这一定是一个故障。 故障排除步骤: 删除应用 -> 重启模拟器 -> 清理构建文件夹 -> 重新构建 -> 运行。您也可以先尝试在不同的模拟器中运行以节省时间。 【参考方案1】:

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

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

    return UIDropProposal(operation: .move)

但你不能总是使用move!仅当session.allowsMoveOperationtrue

来自move documentation:

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

来自cancel documentation:

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

【讨论】:

【参考方案2】:

我刚刚测试了您的代码,所有方法都被调用了。一定是有问题。

故障排除步骤:

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

【讨论】:

【参考方案3】:

我遇到了这个问题,我发现我没有在 collectionView 中将 dropdelegate 设置为 self。

collectionView.dropDelegate = self

在 viewDidLoad 中添加上述行后,它起作用了!!

override func viewDidLoad() 
    super.viewDidLoad()
    collectionView.dragDelegate = self 
    collectionView.dropDelegate = self
    collectionView.dragInteractionEnabled = true
    collectionView.reorderingCadence = .fast

    // Do any additional setup after loading the view, typically from a nib.

【讨论】:

【参考方案4】:

首先,从 ios 15 开始,dragSessionAllowsMoveOperation 默认为 true

讨论 如果不实现这个方法,默认返回 值为 YES。

就我而言 func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator)

没有被调用,因为我在里面设置了一个断点

func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?)

出于同样的原因,此断点阻止触发另一个委托方法。一旦我删除它们,一切正常。

我希望这对其他人有帮助,因为它让我发疯。

【讨论】:

以上是关于UIDropInteractionDelegate performDrop 没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章