SwiftUI 拖放中的 NSItemProvider loadObject

问题描述 投票:0回答:1

我正在 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
    }
}
swift swiftui drag-and-drop ios14 nsitemprovider
1个回答
0
投票

为那些可能发现此问题的人进行更新。

我了解到在dragEntered/dragUpdated期间不提供数据的原因是用户可能没有提供同意,因此拖动只是意外进入了您的应用程序。

这就是为什么无法获取此数据的原因。

对于我的应用内传输,我最终使用了侧面通信通道,这不是很好,但我只需要它进行预览。

© www.soinside.com 2019 - 2024. All rights reserved.