QLPreviewController 在 iOS 6 中不起作用
Posted
技术标签:
【中文标题】QLPreviewController 在 iOS 6 中不起作用【英文标题】:QLPreviewController not working in iOS 6 【发布时间】:2012-09-28 15:57:14 【问题描述】:在 ios 6 中,QLPreviewController 不再从 URL 加载 PDF。它在 iOS 5 中运行良好。我已经实现了 QLPreviewControllerDataSource 方法,如 here 所述。
#pragma mark - QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller
return 1;
- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index;
NSURL *fileURL = [NSURL URLWithString:@"http://www.bliley.net/XTAL/PDF_Instructions/Test_File.pdf"];
return fileURL;
这在 iOS 5 中完美运行,但在 iOS 6 中控制台输出:
Couldn't issue file extension for path: /XTAL/PDF_Instructions/Test_File.pdf
【问题讨论】:
它实际上不需要使用本地文件 URL 吗?在我看来,您使用的是远程 url,并且在 host 部分之后的所有内容都出错了。 有人告诉我,在 ios 6 中,他们对该方法实施了更严格的检查,即 url 大多数以“file://”开头,但我找不到任何文档。如果有人知道参考,请发布。 您找到解决方案了吗?如果是这样,请分享或接受答案。谢谢 【参考方案1】:您是否尝试过使用 fileURLWithPath 而不是 URLWithString?我有其他问题通过这样做得到解决。
也不确定 QLPreviewController 是否会处理远程 URL。如果没有,您可以下载文件然后显示它。
【讨论】:
fileURLWithPath 解决了我的问题!谢谢! 我已经在 App Store 中有一个应用程序。它在 iOS 5 中运行良好。但它不再运行了。我需要更改所有内容以使其正常工作吗? Apple 的“升级”真是太棒了。【参考方案2】:我从远程 url 下载文件并保存在本地,然后使用 QLPreviewController 显示 PDF。在 iOS 6 中它可以工作。
首先我使用以下代码从远程 url 保存文件:
NSString *local_location;
NSString *path = [[NSBundle mainBundle] pathForResource:@"sampleData" ofType:@"plist"];
path = NSTemporaryDirectory();
local_location= [path stringByAppendingPathComponent:[NSString stringWithFormat:@"My_Invoice.pdf"]];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString: remoteurl]];
[request setDownloadDestinationPath:local_location];
[request startSynchronous];
用于显示 Pdf:
QLPreviewController* preview = [[QLPreviewController alloc] init];
preview.dataSource = self;
[self presentModalViewController:preview animated:YES];
QLPreviewController 委托方法是:
- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
return 1;
- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
return [NSURL fileURLWithPath:local_location];
【讨论】:
只是我的两分钱:如果 URL 指向的文件不存在,您还会收到“无法为路径发出文件扩展名”错误。因此,如果您下载文件并将错误的 URL 提供给 QLPreviewController,您将收到同样的错误。为什么要这么做 ?确实会发生愚蠢的错误... @SébastienNussbaumer 我的项目中没有出现此错误。一次检查你的路径。 对不起,我不是说这发生在你的项目中,只是发生在我的项目中,想让其他读者知道检查文件是否存在是个好主意:)跨度> 【参考方案3】:我遇到了类似的问题,似乎它可能源于对 QLPreviewItem 的文件类型 URL 的更严格执行
@property (readonly) NSURL *previewItemURL;
Discussion
This property is used by a Quick Look preview controller to get an item’s URL. In typical use, you would implement a getter method in your preview item class to provide this value.
The value of this property must be a file-type URL.
If the item is not available for preview, this property’s getter method should return nil. In this case, the Quick Look preview controller displays a “loading” view.
Availability
Available in iOS 4.0 and later.
Declared In
QLPreviewItem.h
更新:我已经向 Apple 提出了一个针对 iOS 6 处理此问题的错误,并且似乎他们已将其视为错误,因此可能会在不久的将来提供修复。我打开的错误与使用自定义 NSURLProtocols 进行预览有关,但也可能适用于其他方面。
Link to class
【讨论】:
仍然没有来自 Apple 的更新,但能够使用 UIWebView 并覆盖 urlprotocol 来加载文件【参考方案4】:但请注意,QLPreviewController 需要一个指向本地资源的 URL
您需要先在本地下载并保存 PDF 文件,然后为本地文件创建正确的文件 URL。
【讨论】:
以上是关于QLPreviewController 在 iOS 6 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin QLPreviewController + NavigationPage 在 iOS 10 上损坏
iOS 上的 UIDocumentInteractionController 与 QLPreviewController
qlpreviewcontroller 在 iOS 中点击全屏