【发布时间】:2021-05-20 11:22:29
【问题描述】:
我为 UIKit 的 QLPreviewController 添加了一个 UIViewControllerRepresentable,我在 related question 中找到了它:
struct QuickLookView: UIViewControllerRepresentable {
var url: URL
var onDismiss: (() -> Void) = { }
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func updateUIViewController(_ viewController: UINavigationController, context: UIViewControllerRepresentableContext<Self>) {
(viewController.topViewController as? QLPreviewController)?.reloadData()
}
func makeUIViewController(context: Context) -> UINavigationController {
let controller = QLPreviewController()
controller.dataSource = context.coordinator
controller.reloadData()
return UINavigationController(rootViewController: controller)
}
class Coordinator: NSObject, QLPreviewControllerDataSource {
var parent: QuickLookView
init(_ qlPreviewController: QuickLookView) {
self.parent = qlPreviewController
super.init()
}
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
self.parent.url as QLPreviewItem
}
}
}
在我的应用程序中,我通过 Alamofire 下载了一个文件 (jpg/png/pdf):
let destination: DownloadRequest.Destination = { _, _ in
let documentsURL = FileManager.default.documentsDirectory
.appendingPathComponent(document.id.string)
.appendingPathComponent(document.name ?? "file.jpg")
return (documentsURL, [.removePreviousFile, .createIntermediateDirectories])
}
AF
.download(url, to: destination)
.responseURL { (response) in
guard let url = response.fileURL else { return }
self.fileURL = url
self.isShowingDoc = true
}
...并将其本地 url 传递给 QuickLookView 以显示它:
@State private var isShowingDoc = false
@State private var fileURL: URL?
var body: some View {
// ...
.sheet(isPresented: $isShowingDoc, onDismiss: { isShowingDoc = false }) {
QuickLookView(url: fileURL!) {
isShowingDoc = false
}
}
}
发生的情况是QuickLookView 作为工作表打开,文件闪烁(显示大约 0.1 秒),然后视图变为空白:
我在 Finder 中检查了应用程序的 Documents 文件夹,该文件在那里并且与传递给 QuickLookView 的 url 匹配。我注意到,当视图打开时,然后我通过 Finder 从文件夹中删除文件,然后视图会抛出一个错误,说没有这样的文件 - 这意味着它在删除之前确实正确读取了它。
注意:我在某处读到 QL 控制器在放置在导航控制器中时出现问题。在我的视图层次结构中,我的视图嵌入在 NavigationView 中——这可能会导致问题吗?
我该如何解决这个问题?
【问题讨论】:
-
你能分享一下你传递本地网址的方式吗
-
这适用于本地 pdf、png、jpeg、gif 文件,一切似乎都正常
-
@cedricbahirwe 我已经更新了我的帖子,并包含了我如何获取文件和传递 url 的摘要版本。再次,文件显示在 Finder 中,当我打印 url 时,它正确地将我带到文件。
-
您可能是在完成下载之前创建视图