SwiftUI macOS onDrop简单文本总是失败



尝试实现文本文件的简单拖放:

struct ContentView: View {

@State private var drag = false

var body: some View {
Text("Hello, world!")
.frame(width: 300, height: 300)
.onDrop(of: [.url], isTargeted: $drag) { (providers, location) in


print("Can load", providers.first?.canLoadObject(ofClass: NSURL.self) == true) // Always false

providers.first?.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil, completionHandler: { secureCoding, error in

if let error = error {
print(error) // Cannot load representation of type ...
}

if let item = secureCoding as? Data { // Always nil
print("got data")
}
})

return true
}
}
}

尝试播放已删除文件的UTType(public.url,public.data)和loadItem(forTypeIdentifier)。我试过的都没用。发现了类似的问题,但它们不起作用,而且答案看起来已经过时了。

我有旧的Cocoa代码,使用registerForDraggedTypes,如果它有效的话,这看起来要简单得多。。

刚刚用纯.txt文件进行了修改和测试。Xcode 13.3/macOS 12.3.1

@State private var text = "Drop Here"
var body: some View {
Text(text)
.frame(width: 200, height: 200).border(.red)
.onDrop(of: ["public.file-url"], isTargeted: $dragOver) { providers -> Bool in
providers.first?.loadDataRepresentation(forTypeIdentifier: "public.file-url", completionHandler: { (data, error) in
if let data = data, let path = NSString(data: data, encoding: 4), let url = URL(string: path as String) {
if let value = try? String(contentsOf: url, encoding: .utf8) {
DispatchQueue.main.async {
self.text = value
}
}
}
})
return true
}

*注意:我记不清具体在哪里了,但我在苹果的文档中遇到过,对于特定的用例,我们必须使用具体的UTTypes,而不是通用的,即fileURL实际上是URL,但为了匹配,必须准确地指定它!

我想发布我自己的答案,只是为了指出陷阱。多亏了@Asperi,我得到了一个工作样本。

  1. .onDrop(of: [.fileURL],需要是UTType.fileURL(或public.file-url),而不是UTType.url
  2. 我用的是providers.first?.loadItem(forTypeIdentifier:...,需要是loadDataRepresentation(forTypeIdentifier:...
  3. 读取数据:
    使用let path = String(data: data, encoding: .utf8)有效。下一步很重要,我需要使用URL(string:)。而不是URL(fileURLWithPath:)
    使用URL(fileURLWithPath:)将生成类似于具有安全作用域的URL的内容

其他次要注意事项:
使用let path = String(data: data, encoding: .utf8)有效,不需要NNString
使用UTType.fileURL(String使用UTType.fileURL.identifier)也可以,无需对"public.file-url"进行硬编码

最新更新