问题描述
我正在集成UIDocumentPickerViewController
以显示用于浏览和选择PDF的本地存储(文件应用)。现在,我正在选择一个PDF并将URL传递给WKWebview进行预览,效果很好。但是当我启用allowsMultipleSelection
时,我可以选择多个文件并获取多个URL
NSArray *types = @[(Nsstring*)kUTTypePDF];
//Create a object of document picker view and set the mode to Import
UIDocumentPickerViewController *docPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:types inMode:UIDocumentPickerModeImport];
//Set the delegate
docPicker.delegate = self;
docPicker.allowsMultipleSelection = true; // Allows multiple selection.
//present the document picker
[self presentViewController:docPicker animated:YES completion:nil];
获取多个URL的代表是:
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray <NSURL *>*)urls API_AVAILABLE(ios(11.0));
现在我的输出为:
使用WKWebView预览时,我只能预览一个文件,如下所示:
但是我想像WhatsApp一样预览两个选定的文件,如下所示。在这里,我可以水平滑动以预览选定的文件
如何预览类似于WhatsApp的多个文件?请在这方面帮助我。
解决方法
使用QLPreviewController;您需要import QuickLook
。这是一个视图控制器。您可以将其显示为呈现的视图控制器,或将其推入导航控制器的堆栈中。
在此示例中,我的“文档”目录中某处有一个或多个PDF或文本文档。我获取了它们的URL列表,并显示了它们的预览(self.exts
已初始化为由["pdf","txt"]
组成的集合):
self.docs = [URL]()
do {
let fm = FileManager.default
let docsurl = try fm.url(for:.documentDirectory,in: .userDomainMask,appropriateFor: nil,create: false)
let dir = fm.enumerator(at: docsurl,includingPropertiesForKeys: nil)!
for case let f as URL in dir {
if self.exts.contains(f.pathExtension) {
if QLPreviewController.canPreview(f as QLPreviewItem) {
self.docs.append(f)
}
}
}
guard self.docs.count > 0 else { return }
let preview = QLPreviewController()
preview.dataSource = self
preview.currentPreviewItemIndex = 0
self.present(preview,animated: true)
} catch {
print(error)
}
您会注意到,我没有告诉QLPreviewController要预览哪些文档。这就是QLPreviewController的数据源的工作。在我的代码中,我(self
)也是数据源。我只是从URL列表中获取所需的信息,而该URL先前已保存到self.docs
中:
func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
return self.docs.count
}
func previewController(_ controller: QLPreviewController,previewItemAt index: Int) -> QLPreviewItem {
return self.docs[index] as QLPreviewItem
}
第二种数据源方法要求我们返回一个采用QLPreviewItem协议的对象。 URL 确实采用了此协议。