【问题标题】:QLPreviewController: Where is the temporary file located?QLPreviewController:临时文件在哪里?
【发布时间】:2011-05-05 17:50:29
【问题描述】:

我正在使用 QLPreviewController 从我的服务器获取和查看远程 PDF。这非常有效,因为 Apple 在文件下载时内置了一个漂亮的“正在加载”图形。现在,我还想使用需要本地文件的 UIDocumentInteractionController。但是,由于 QLPreviewController 已经下载了该文件,我想使用它。

有没有办法获取 QLPreviewController 下载的文件的本地路径?

QLPreviewController *previewController = [[QLPreviewController alloc] init];
previewController.dataSource = self;
previewController.delegate = self;
previewController.currentPreviewItemIndex = 0;
[[self navigationController] pushViewController:previewController animated:YES];
[previewController release];
// Where is the file stored?

【问题讨论】:

  • 你是如何使用 QLPreviewController 在方法“previewItemAt”中获取远程 PDF 的

标签: iphone ios pdf qlpreviewcontroller


【解决方案1】:

我们有一个类似的场景,其中要显示的文件是远程的。这是我们所做的:我们将数据源设置为 nil。这样做是显示一个加载图标。在 viewDidLoad 我们初始化远程请求并将文件保存在本地。下载文件后,我们正确设置数据源并刷新视图。

 //after file has been downloaded
 [self setDataSource:self];
 [self reloadData];

【讨论】:

    【解决方案2】:

    QLPreviewController 并非真正设计用于下载文件 - 来自 QLPreviewItem 的文档:

    @property (readonly) NSURL *previewItemURL;

    此属性由快速查看使用 预览控制器以获取项目的 网址。在典型使用中,您会 在你的实现一个getter方法 预览项目类来提供这个 价值。

    此属性的值必须是文件类型的 URL。

    所以你真的应该使用其他东西来下载文件。它可能与网络资源一起使用,但它并不是为真正使用它而设计的。甚至不确定你是如何管理它的,因为我很确定如果你没有传递文件 URL,QuickLookController 会出错。控制器很可能将文件下载到临时目录或直接下载到内存。无论哪种方式,它都不供您使用。

    您应该自己下载文件,然后将指向它的文件 URL 传递给 Quick Look 控制器。如果您想让自己更轻松,可以使用 ASIHTTP 之类的网络库。

    【讨论】:

    • 很抱歉在将近 2 个月后提出它,但我遇到了同样的问题,我尝试使用 UIDocumentInteractionController,但我只能通过模态显示。 QLPreviewController 有一个属性 'currentPreviewItem' 但它只返回一个 QLPreviewItem 女巫有一个 URL,但这不是本地的。我已经考虑过你的答案,但我想在文件加载时与工具栏交互。有什么建议吗?
    • 正如我所提到的,您将希望使用内置 API(如 NSURLConnection)或第三方库(如 @987654326)异步(在后台)下载文件@),然后仅在文件下载到手机内存后尝试打开文件。如果您异步下载它,您将不会阻止用户交互。