SwiftUI .fileImporter在真实iPhone设备上无法正常工作的问题
SwiftUI .fileImporter 在真实iPhone设备上失效的问题
SwiftUI的.fileImporter功能已出现问题长达一年:该功能在iPhone模拟器、Mac Catalyst及真实iPad设备上均能正常工作,但在真实iPhone设备测试时,文件选择器无法选中文件,弹窗完全无法关闭,回调函数也不会触发。而使用UIKit的UIDocumentPickerViewController时,无论在Mac Catalyst、模拟器、iPad还是真实iPhone上,所有功能均正常运行。
复现步骤
- 创建一个基于SwiftUI的新Xcode项目。
- 替换
ContentView.swift中的代码为以下内容:
import SwiftUI struct ContentView: View { @State var sShowing = false @State var uShowing = false @State var showAlert = false @State var alertText = "" var body: some View { VStack { VStack { Button("Test SWIFTUI") { sShowing = true } } .fileImporter(isPresented: $sShowing, allowedContentTypes: [.item]) {result in alertText = String(describing: result) showAlert = true } VStack { Button("Test UIKIT") { uShowing = true } } .sheet(isPresented: $uShowing) { DocumentPicker(contentTypes: [.item]) {url in alertText = String(describing: url) showAlert = true } } .padding(.top, 50) } .padding() .alert(isPresented: $showAlert) { Alert(title: Text("Result"), message: Text(alertText)) } } }
- 创建新文件
DocumentPicker.swift,并粘贴以下代码:
import SwiftUI import UniformTypeIdentifiers struct DocumentPicker: UIViewControllerRepresentable { let contentTypes: [UTType] let onPicked: (URL) -> Void func makeCoordinator() -> Coordinator { Coordinator(self) } func makeUIViewController(context: Context) -> UIDocumentPickerViewController { let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: contentTypes, asCopy: true) documentPicker.delegate = context.coordinator documentPicker.modalPresentationStyle = .formSheet return documentPicker } func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {} class Coordinator: NSObject, UIDocumentPickerDelegate { var parent: DocumentPicker init(_ parent: DocumentPicker) { self.parent = parent } func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { print("Success!", urls) guard let url = urls.first else { return } parent.onPicked(url) } func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) { print("Picker was cancelled") } } }
- 在Mac Catalyst上运行项目,确认功能正常。
- 在真实iPhone设备上测试,即可复现问题。
内容的提问来源于stack exchange,提问作者NitroRX
相关产品推荐
相关产品推荐

