我想用来UIDocumentPickerViewController
选择导出文件的位置。我使用它来包装它UIViewControllerRepresentable
并将它呈现在一个ZStack
. 它可以工作,文件已写入,但随后它会永远留在屏幕上,并带有旋转的轮子。
有正确的方法吗?或者,如果它是一个错误,有没有办法解决它?
struct ContentView: View {
@State var exportImageURL: URL? = nil
var body: some View {
ZStack {
Button { export() } label: {
Text("Export File")
}
if let url = exportImageURL {
WrappedUIDocumentPickerViewController(url: url) {
exportImageURL = nil
}
}
}
}
func export() {
let docs = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let doc = docs.appendingPathComponent("Test.png")
let junkData = Data(count: 1000)
try! junkData.write(to: doc, options: .atomic)
print("Exported. \(doc)")
exportImageURL = doc
}
}
// Wrapper
struct WrappedUIDocumentPickerViewController: UIViewControllerRepresentable {
let url: URL
let onCancel: () -> Void
typealias UIViewControllerType = UIDocumentPickerViewController
func makeUIViewController(context: Context) -> UIViewControllerType {
let vc = UIDocumentPickerViewController(forExporting: [url], asCopy: false)
vc.delegate = context.coordinator
return vc
}
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
print("update")
}
func makeCoordinator() -> Coordinator {
Coordinator(onCancel: onCancel)
}
class Coordinator: NSObject, UIDocumentPickerDelegate {
let onCancel: () -> Void
init(onCancel: @escaping () -> Void) {
self.onCancel = onCancel
}
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
print("picked \(urls)")
}
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
onCancel()
}
}