【发布时间】:2020-11-07 01:36:21
【问题描述】:
我正在使用 DropDelegate 在 iOS 上的 SwiftUI 中处理拖放操作。我在这里有一个简化的示例应用程序:
https://gist.github.com/jhaungs/6ac2c3a34309b7115eef40925c27b1ab
问题似乎是 SwiftUI 框架和我的代码之间的交互。如果您尝试在 dropEntered 或 dropUpdated 调用中从 DropInfo 加载 itemProvider,系统永远不会调用 DropInfo模型上的strong>loadData函数;但不知何故,当从 performDrop.
调用相同的代码时,它可以正常工作如果在getItem中设置断点或添加打印语句,可以看到itemProviders永远不会为空;它只有一个正确类型的项目提供者(utf8 文本)。但是在其上调用 loadObject 只会在从 performDrop 调用 getItem 时调用 loadData,。所以有一些不透明的内部状态来调解数据传输。
任何想法为什么这不一致?对我来说这似乎是一个错误。
在 dropEntered 和 dropUpdated 中,我想知道我在拖动什么,这样我就可以做一些事情,比如突出显示它,或动画它,甚至可能禁止或取消下降,但没有反馈。
我也可能做错了。我花了很多时间在它上面,这是我最接近它的工作。尚不清楚每个项目一个 DropDelegate 是否正确或明智。文档非常缺乏,尤其是工作示例。
关于另一个 StackOverflow 问题的建议是将当前项目分配给 onDrag 中的 viewModel 变量,但这会产生变量未一致设置或清除的竞争条件。
SwiftUI | Using onDrag and onDrop to reorder Items within one single LazyGrid?
【问题讨论】:
-
你发现了吗?我也有类似的问题。
-
写完这篇文章后不久,我就放弃了针对这个特定用例的拖放操作,并以不同的方式进行了操作(弹出了一个移动目标列表以供选择)。但据我所知,实际放置可能是一项非常昂贵的操作,例如,复制一组文件,因此在整个拖动结束时调用 performDrop 之前它实际上并没有进行放置/drop 用户承诺实际进行放置时的循环。
-
我想这确实可以。希望随着 SwiftUI 的成熟,某些不能发生这种情况的用例将得到改进(例如预览布局更改)。
标签: ios swiftui drag-and-drop delegates