【问题标题】:UIDropInteractionDelegate performDrop not called?UIDropInteractionDelegate performDrop 没有被调用?
【发布时间】: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)

永远不会被调用。

有什么建议吗?

【问题讨论】:

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

标签: ios swift drag-and-drop uikit


【解决方案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?)

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-15
          • 1970-01-01
          • 1970-01-01
          • 2018-11-25
          • 2019-03-31
          • 2012-12-16
          • 2015-03-28
          • 2012-12-04
          相关资源
          最近更新 更多