0

我想用来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()
        }
    }

4

0 回答 0