问题描述
我正在尝试为用户创建一个选择器,以便在 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 & 的文件夹用户界面文档选择器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!