无法选择带有 UIViewRepresentable & 的文件夹用户界面文档选择器 [英] Can't select a folder with UIViewRepresentable & UIDocumentPicker

查看:53
本文介绍了无法选择带有 UIViewRepresentable & 的文件夹用户界面文档选择器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为用户创建一个选择器,以便在 SwiftUI 应用程序中选择一个文件夹.但是,似乎还没有任何 SwiftUI 文档选择器,因此我尝试使用 UIViewRepresentable 使用此处概述的文件夹文档选择器显示文档选择器:

FolderPicker 代码:

struct FolderPicker: UIViewControllerRepresentable {@Binding var folderURL:字符串?func makeCoordinator() ->协调员{返回 FolderPicker.Coordinator(parent: self)}func makeUIViewController(context: UIViewControllerRepresentableContext) ->UIDocumentPickerViewController {let picker = UIDocumentPickerViewController(documentTypes: [kUTTypeFolder"], in: .import)picker.delegate = context.coordinator返回选择器}func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext) {}类协调器:NSObject,UIDocumentPickerDelegate {var 父级:FolderPicker初始化(父:FolderPicker){self.parent = 父母}内部 func documentPicker(_ 控制器: UIDocumentPickerViewController, didPickDocumentAt url: URL){打印(网址)parent.folderURL = url.absoluteString}}}

TestView 中:

struct TestView: View {@State var displayPicker = falsevar主体:一些视图{按钮(动作:{displayPicker.toggle},标签:toggle").sheet(isPresented: $showPicker) {FolderPicker(文件夹网址:$ url)}}}

解决方案

kUTTypeFolder 不是字符串.

正确的做法是

<预><代码>let picker = UIDocumentPickerViewController(documentTypes: [kUTTypeFolder as String], in: .import)

常量kUTTypeFolder 来自import CoreServices.

还有public init(documentTypes allowedUTI: [String], in mode: UIDocumentPickerMode)可选的func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url:URL)已弃用

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

最终代码是:

struct FolderPicker: UIViewControllerRepresentable {@Binding var folderURL:字符串?func makeCoordinator() ->协调员{返回 FolderPicker.Coordinator(parent: self)}func makeUIViewController(context: UIViewControllerRepresentableContext) ->UIDocumentPickerViewController {让选择器 = UIDocumentPickerViewController(forOpeningContentTypes: [.folder])picker.delegate = context.coordinator返回选择器}func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext) {}类协调器:NSObject,UIDocumentPickerDelegate {var 父级:FolderPicker初始化(父:FolderPicker){self.parent = 父母}func documentPicker(_ 控制器: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {守卫让 url = urls.first else {返回}打印(网址)parent.folderURL = url.absoluteString}}}

I'm trying to create a picker for a user to choose a folder in a SwiftUI app. However, there doesn't seem to be any SwiftUI document picker yet so I was attempting to use UIViewRepresentable to display a document picker using the folder document picker outlined here: https://developer.apple.com/documentation/uikit/view_controllers/providing_access_to_directories. However, as seen in the image below I'm not actually able to select the folder in any way - am I missing specific to use the picker with SwiftUI?

FolderPicker code:

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
        }
    }
}

which is in a TestView:

struct TestView: View {
    @State var displayPicker = false

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

解决方案

kUTTypeFolder is not a string.

The correct way is


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

The constant kUTTypeFolder comes from import CoreServices.

Also, public init(documentTypes allowedUTIs: [String], in mode: UIDocumentPickerMode) and optional func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL)is deprecated

So use, public convenience init(forOpeningContentTypes contentTypes: [UTType]) and optional func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL])

Final code is :

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
        }
    }
}

这篇关于无法选择带有 UIViewRepresentable &amp; 的文件夹用户界面文档选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆