0

我在 SwiftUI 中使用 DropDelegate 拖放视图。我使用 .onDrag 视图修改器成功地将我的数据包装在 NSItemProvider 中,如果我能够让我的放置数据成为我的 DropDelegate 的存储属性之一,我什至可以让 .onDrop 工作。

我正在尝试允许使用提供的 DropInfo 解码我的放置数据。我在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
    }
}
4

0 回答 0