我正在 SwiftUI 中使用 DropDelegate 拖放视图。 我成功使用 .onDrag View Modifier 将数据包装在 NSItemProvider 中,如果我能够让我的放置数据成为我的 DropDelegate 的存储属性之一,我什至可以让 .onDrop 工作。
我试图允许使用提供的 DropInfo 解码我的 drop 数据。 我在
dropEntered(info:)
委托方法中更新了我的视图,以便用户可以在其掉落发生之前预览。 当我写的时候
info.itemProviders.first?.loadObject(...) { reading, error in
...
}
未调用完成处理程序。 如果我在
performDrop(info:)
委托方法中编写此闭包,则会调用完成处理程序。 为什么完成处理程序只在 performDrop(info:)
中调用? 有没有办法在实时执行必要更改的同时进行拖放预览,而不更改数据模型dropEntered(info:)
?
我不喜欢在
dropEntered(info:)
中编辑我的数据模型,而且我还没有弄清楚如果用户以某种方式取消拖放操作会如何工作......也许有更好的方法这将允许我在 performDrop(info:)
中编辑我的数据模型?
谢谢!
这是重现该错误的代码:
struct ReorderableForEach<Content: View, Item: Identifiable>: View {
let items: [Item]
let content: (Item) -> Content
var body: some View {
ForEach(items) { item in
content(item)
.onDrag {
return NSItemProvider(object: "\(item.id)" as NSString)
}
.onDrop(
of: [.text],
delegate: DragRelocateDelegate()
)
}
}
}
struct DragRelocateDelegate: DropDelegate {
func dropEntered(info: DropInfo) {
let _ = info.itemProviders(for: [.text]).first?.loadObject(ofClass: String.self) { item, error in
print("dropEntered: \(item)") // Won't trigger this
}
}
func performDrop(info: DropInfo) -> Bool {
let _ = info.itemProviders(for: [.text]).first?.loadObject(ofClass: String.self) { item, error in
print("performDrop: \(item)") // Will trigger this
}
return true
}
}
为那些可能发现此问题的人进行更新。
我了解到在dragEntered/dragUpdated期间不提供数据的原因是用户可能没有提供同意,因此拖动只是意外进入了您的应用程序。
这就是为什么无法获取此数据的原因。
对于我的应用内传输,我最终使用了侧面通信通道,这不是很好,但我只需要它进行预览。