QLPreviewController在iOS 6中无法工作

11

iOS 6中,QLPreviewController不再从URL加载PDF文件。而在iOS 5中可以正常使用。我已经按照这里所述实现了QLPreviewControllerDataSource方法。

#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,并且在http://host/部分之后出现错误。 - valheru
有人告诉我,在iOS 6中,他们对这个方法进行了更严格的检查,URL必须以“file://”开头,但我找不到任何相关文档。如果有人知道参考资料,请发布出来。 - MikeIsrael
你找到解决方案了吗?如果是,请分享或接受一个答案。谢谢。 - Daniel Benedykt
4个回答

8

你尝试使用fileURLWithPath而不是URLWithString了吗?我曾经遇到其他问题,通过这样做解决了。

另外,我不确定QLPreviewController是否能处理远程URL。如果不能,你可以下载文件然后显示它。


1
fileURLWithPath 修复了我的问题!谢谢! - Josip B.
我已经在App Store上有一个应用程序。它在iOS 5中运行良好。但现在不再起作用了。我需要改变一切让它重新工作?苹果公司的升级真是太棒了。 - Bagusflyer

7

我从远程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];


}

2
只是我的个人意见:如果URL指向的文件不存在,您也会收到“无法为路径发出文件扩展名”的错误。所以,如果您下载了该文件并将错误的URL提供给QLPreviewController,则会收到相同的错误。为什么会这样呢?嗯,愚蠢的错误确实会发生... - Sébastien Nussbaumer
@SébastienNussbaumer 我在我的项目中没有遇到这个错误。请检查一下你的路径。 - Suresh
1
抱歉,我不是说这件事发生在你的项目中,只是发生在我的项目中,并想让其他读者知道检查文件是否存在是一个好主意 :) - Sébastien Nussbaumer

4

我遇到了类似的问题,似乎是由于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

更新:我已经向苹果提交了一个关于iOS 6的问题的错误报告,他们已经将其作为一个错误来处理,因此可能会在不久的将来提供修复。 我提交的错误与使用自定义NSURLProtocols进行预览有关,但也可能适用于其他方面。

类链接


仍然没有来自苹果的更新,但是我能够使用UIWebView和覆盖urlprotocol来加载文件,从而找到了一个解决方法。 - MikeIsrael

0

但请注意,QLPreviewController需要一个指向本地资源的URL。

您需要先下载并保存PDF文件到本地,然后创建一个正确的本地文件URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接