SwiftUI中如何为.fileImporter设置默认选择目录?
为SwiftUI的.fileImporter设置默认选中文件夹的方案
原生.fileImporter的限制
SwiftUI的.fileImporter修饰器目前没有提供类似UIKit中UIDocumentPickerViewController的directoryURL参数,无法直接指定默认打开的文件夹。
通过UIViewControllerRepresentable实现自定义文档选择器
我们可以封装UIKit的UIDocumentPickerViewController来实现默认文件夹的设置,具体实现如下:
1. 自定义文档选择器组件
import SwiftUI import UIKit import UniformTypeIdentifiers struct CustomDocumentPicker: UIViewControllerRepresentable { let supportedTypes: [UTType] let defaultDirectory: URL? @Binding var isPresented: Bool let onPick: (URL) -> Void func makeUIViewController(context: Context) -> UIDocumentPickerViewController { let picker = UIDocumentPickerViewController(forOpeningContentTypes: supportedTypes) picker.delegate = context.coordinator // 设置默认打开的目标文件夹 if let directoryURL = defaultDirectory { picker.directoryURL = directoryURL } return picker } func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: Context) {} func makeCoordinator() -> Coordinator { Coordinator(parent: self) } class Coordinator: NSObject, UIDocumentPickerDelegate { let parent: CustomDocumentPicker init(parent: CustomDocumentPicker) { self.parent = parent } func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) { guard let selectedURL = urls.first else { return } parent.onPick(selectedURL) parent.isPresented = false } func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) { parent.isPresented = false } } }
2. 在SwiftUI视图中调用
struct ContentView: View { @State private var showDocumentPicker = false // 示例:将App的Documents目录设为默认打开路径 private let defaultTargetDir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first var body: some View { Button("打开自定义文档选择器") { showDocumentPicker = true } .sheet(isPresented: $showDocumentPicker) { CustomDocumentPicker( supportedTypes: [.text, .pdf], defaultDirectory: defaultTargetDir, isPresented: $showDocumentPicker, onPick: { selectedURL in // 处理选中的文件 print("已选中文件:\(selectedURL.lastPathComponent)") } ) } } }
关键注意事项
- 确保App拥有目标目录的访问权限,若需访问iCloud或沙盒外目录,需在项目中配置对应的权限 entitlement。
defaultDirectory必须是App有权限访问的合法URL,否则默认文件夹设置不会生效。
内容的提问来源于stack exchange,提问作者arroyot24
相关产品推荐
相关产品推荐

