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.allowsMoveOperation
为true
!
来自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 没有被调用?的主要内容,如果未能解决你的问题,请参考以下文章