【问题标题】:Can't select a folder with UIViewRepresentable & UIDocumentPicker无法使用 UIViewRepresentable 和 UIDocumentPicker 选择文件夹
【发布时间】:2023-03-19 01:46:01
【问题描述】:

我正在尝试为用户创建一个选择器,以便在 SwiftUI 应用程序中选择一个文件夹。但是,似乎还没有任何 SwiftUI 文档选择器,因此我尝试使用UIViewRepresentable 来显示使用此处概述的文件夹文档选择器的文档选择器:https://developer.apple.com/documentation/uikit/view_controllers/providing_access_to_directories。但是,如下图所示,我实际上无法以任何方式选择文件夹 - 我是否缺少将选择器与 SwiftUI 一起使用的特定内容?

FolderPicker代码:

struct FolderPicker: UIViewControllerRepresentable {
    @Binding var folderURL: String?
    
    func makeCoordinator() -> Coordinator {
        return FolderPicker.Coordinator(parent: self)
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<FolderPicker>) -> UIDocumentPickerViewController {
        let picker = UIDocumentPickerViewController(documentTypes: ["kUTTypeFolder"], in: .import)
        picker.delegate = context.coordinator
        return picker
    }
    
    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<FolderPicker>) {}
    
    class Coordinator: NSObject, UIDocumentPickerDelegate {
        var parent: FolderPicker
        
        init(parent: FolderPicker) {
            self.parent = parent
        }
        
        internal func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL){
            print(url)
            parent.folderURL = url.absoluteString
        }
    }
}

TestView:

struct TestView: View {
    @State var displayPicker = false

    var body: some View {
        Button(action: {displayPicker.toggle}, label: "toggle")
            .sheet(isPresented: $showPicker) {
                FolderPicker(folderURL: $url)
            }
    }
}

【问题讨论】:

标签: ios swiftui uikit


【解决方案1】:

kUTTypeFolder 不是字符串。

正确的做法是


let picker = UIDocumentPickerViewController(documentTypes: [kUTTypeFolder as String], in: .import)

常量kUTTypeFolder 来自import CoreServices

另外public init(documentTypes allowedUTIs: [String], in mode: UIDocumentPickerMode)optional func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) 已弃用

所以使用public convenience init(forOpeningContentTypes contentTypes: [UTType])optional func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL])

最终代码是:

struct FolderPicker: UIViewControllerRepresentable {
    
    @Binding var folderURL: String?
    
    func makeCoordinator() -> Coordinator {
        return FolderPicker.Coordinator(parent: self)
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<FolderPicker>) -> UIDocumentPickerViewController {
        let picker = UIDocumentPickerViewController(forOpeningContentTypes: [.folder])
        picker.delegate = context.coordinator
        return picker
    }
    
    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<FolderPicker>) {}
    
    class Coordinator: NSObject, UIDocumentPickerDelegate {
        var parent: FolderPicker
        
        init(parent: FolderPicker) {
            self.parent = parent
        }
        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            guard let url = urls.first else {
                return
            }
            print(url)
            parent.folderURL = url.absoluteString
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2020-01-31
    • 2016-10-08
    • 1970-01-01
    相关资源
    最近更新 更多