当前位置: 首页 > 面试题库 >

如何使用QLPreviewController快速显示远程文档

王高邈
2023-03-14
问题内容

我正在使用QLPreviewController预览文档。但是我不知道如何显示存储在服务器上的文档。


问题答案:

你不能
QuickLook仅适用于本地资源文件。您需要首先异步下载数据,将其保存到文档目录或临时文件夹中,并在完成后从主线程中显示QLPreviewController:

编辑/更新:

Xcode 11.3.1•Swift 5.1

ViewController.swift

import UIKit
import QuickLook

class ViewController: UIViewController, QLPreviewControllerDelegate, QLPreviewControllerDataSource {
    let previewController = QLPreviewController()
    var previewItems: [PreviewItem] = []
    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string:"https://www.adobe.com/support/products/enterprise/knowledgecenter/media/c4611_sample_explain.pdf")!
        quickLook(url: url)
    }
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int { previewItems.count }
    func quickLook(url: URL) {
        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data, error == nil else {
                //  in case of failure to download your data you need to present alert to the user
                self.presentAlertController(with: error?.localizedDescription ?? "Failed to download the pdf!!!")
                return
            }
            // you neeed to check if the downloaded data is a valid pdf
            guard
                let httpURLResponse = response as? HTTPURLResponse,
                let mimeType = httpURLResponse.mimeType,
                mimeType.hasSuffix("pdf")
            else {
                print((response as? HTTPURLResponse)?.mimeType ?? "")
                self.presentAlertController(with: "the data downloaded it is not a valid pdf file")
                return
            }
            do {
                // rename the temporary file or save it to the document or library directory if you want to keep the file
                let suggestedFilename = httpURLResponse.suggestedFilename ?? "quicklook.pdf"
                var previewURL = FileManager.default.temporaryDirectory.appendingPathComponent(suggestedFilename)
                try data.write(to: previewURL, options: .atomic)   // atomic option overwrites it if needed
                previewURL.hasHiddenExtension = true
                let previewItem = PreviewItem()
                previewItem.previewItemURL = previewURL
                self.previewItems.append(previewItem)
                DispatchQueue.main.async {
                    UIApplication.shared.isNetworkActivityIndicatorVisible = false
                    self.previewController.delegate = self
                    self.previewController.dataSource = self
                    self.previewController.currentPreviewItemIndex = 0
                    self.present(self.previewController, animated: true)
                 }
            } catch {
                print(error)
                return
            }
        }.resume()
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    }
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem { previewItems[index] }
    func presentAlertController(with message: String) {
         // present your alert controller from the main thread
        DispatchQueue.main.async {
            UIApplication.shared.isNetworkActivityIndicatorVisible = false
            let alert = UIAlertController(title: "Alert", message: message, preferredStyle: .alert)
            alert.addAction(.init(title: "OK", style: .default))
            self.present(alert, animated: true)
        }
    }
}

扩展URL.swift

extension URL {
    var hasHiddenExtension: Bool {
        get { (try? resourceValues(forKeys: [.hasHiddenExtensionKey]))?.hasHiddenExtension == true }
        set {
            var resourceValues = URLResourceValues()
            resourceValues.hasHiddenExtension = newValue
            try? setResourceValues(resourceValues)
        }
    }
}

PreviewItem.swift

import QuickLook
class PreviewItem: NSObject, QLPreviewItem {
    var previewItemURL: URL?
}


 类似资料:
  • 问题内容: 这是我的代码,但显示了进度。这段代码有什么错误吗?请提供一些想法来解决此问题,或者提供一些与此相关的链接。 问题答案: 更新的答案: 要关闭ProgressHUD:

  • 本文向大家介绍如何使用pm2快速将项目部署到远程服务器,包括了如何使用pm2快速将项目部署到远程服务器的使用技巧和注意事项,需要的朋友参考一下 使用背景 当我们需要将项目部署到远程线上服务器时;传统的方法可能就是: 将本地代码通过ssh、ftp等方式上传到服务器; 然后通过ssh登入到服务器,配置好环境; 手动启动应用。 太过手动化,麻烦,操作繁琐。 现代自动化部署 环境:本地(Mac);远程服务

  • 问题内容: 我编写了以下代码以特定格式显示日期时间: 输出量 我想将“ pm”显示为“ PM”(用大写字母表示),如果电话具有24小时格式,则AM / PM应该不会出现。请帮我。 问题答案: 您可以如下设置DateFormatter amSymbol和pmSymbol: Xcode 8.3•Swift 3.1

  • 函数名称:显示快速设置 函数功能: 下滑显示快速设置 函数方法 keycode.quickSetting() 注意事项 部分设备可能会出现无效的问题,已知模拟器调用此命令可能会失效。 目前积木编程函数和触动精灵函数不通用,请仔细查看本手册,此手册中函数仅支持积木编程,不支持触动精灵,同理请勿将触动精灵函数在积木编程运行。

  • 问题内容: 我正在使用Swift在iOS上进行编程,并且正在使用此代码移动,但是它不起作用。我正确调用了该函数,但是文本字段没有移动。我正在使用自动版式。 问题答案: 现有答案有一些改进。 首先, UIKeyboardWillChangeFrameNotification 可能是最好的通知,因为它处理的不仅是显示/隐藏,还包括由于键盘更改(语言,使用第三方键盘等)和旋转引起的更改(但下面的注释说明

  • 问题内容: 当我收到这样的远程通知时,我实现了一个打开AlertView的功能: 但是NotificationMessage始终为零。 我的json负载看起来像这样: 我正在使用Xcode 6,Swift,并且正在为iOS8开发。我现在搜索了几个小时,但没有找到任何有用的信息。通知工作正常..如果我单击它,则将打开警报视图。我的问题是,我无法从userInfo中获取数据。 问题答案: 字典的根目录