在我的 macOS 应用程序中,我需要允许用户通过使用复制粘贴或拖放从 Finder 中选择绝对本地文件 URL 的列表。我将通过扩展名“.raw”过滤它们,我认为它们应该位于 URL 数组中。我使用支持此功能的应用程序的经验表明我应该同时实现这两个功能。我确实知道如何编写文件选择器,但这不是我想要的。
我一直在使用 Dr. Google 进行搜索,但我发现的内容并不能很好地说明我需要的内容,对我来说太复杂了,无法理解足以用作指南。
这里是一个来自在线教程的示例,它可以作为 C&P,但它离我需要的还很远。它还会产生以下内容:“客户端错误:TUINSRemoteViewController 不会覆盖 -viewServiceDidTerminateWithError:因此除了记录它们之外无法对灾难性错误做出反应”,所以这不是真正好的代码。
struct DataChooserView: View {
@State private var username = "@twostraws"
var body: some View {
VStack {
TextField("Username", text: $username)
.textFieldStyle(.roundedBorder)
PasteButton(payloadType: String.self) { strings in
guard let first = strings.first else { return }
username = first
}
.buttonBorderShape(.capsule)
}
.padding()
}
}
我对 Swift/SwiftUI 缺乏经验,但正在学习。
经过大量挖掘,我发现这适用于拖放。
需要包括:
@Binding var imagePathList: [String] // Debug GOAt
@Binding var imageShortNameList: [String]
@State var url = URL.self
@State var isTargeted = false // ???
我在调试中发现 imagePathList.count 在处理 drop 后立即返回计数 - 1,即在最后一次 .append 之后计数尚未更新。这是没想到的!
Image(nsImage: nsimg)
.resizable()
.scaledToFill()
.aspectRatio(contentMode: .fit)
.frame(width: 640, height: 480)
.border(.green)
.onDrop(of: [.fileURL], isTargeted: $isTargeted) { providers in
imagePathList.removeAll()
imageShortNameList.removeAll()
for provider in providers {
provider.loadObject(ofClass: URL.self) { url, error in
if let url = url {
if url.isFileURL && url.pathExtension == "raw" {
imagePathList.append(url.absoluteString)
imageShortNameList.append(url.lastPathComponent)
} else {
// Handle non-file URLs (e.g., directories)
print("Invalid URL: \(url)")
}
} else if let error = error {
// Handle any errors that occur during URL loading
print("Error loading URL: \(error.localizedDescription)")
}
}
} // DEBUG BELOW
print("First Image \(imageShortNameList.first ?? "")")
print("Last Image \(imageShortNameList.last ?? "")")
return true
} // attract user attention
.border(isTargeted ? Color.red.opacity(1.0) : Color.clear, width: isTargeted ? 2 : 1)