7

我的应用程序一直在使用 QLPreviewController 来显示所有类型的文件,在 iOS 5.x 中,它似乎做得很好。

现在,在 iOS 6.0 中,我收到一个错误,它显示了控制器,但带有一个恒定的加载指示器,并且从未实际加载任何内容。

日志中的错误是:找不到加载代理的预览项目:<QLPreviewItemProxy: 0x8dbf480> - file://localhost/Users/me/Library/Application%20Support/iPhone%20Simulator/6.0/Applications/E6A58F8D-71F3-4C7A -B16E-4BA017E318E5/Documents/temp//Welcome.docx

iOS 6.0 中的 Quicklook 是否还有其他问题?或者有什么建议可以尝试?我已经通过 iPhone 和 iPad 尝试过,同时推动控制器并展示它。

编辑:还刚刚注意到有问题的URL(他们说的那个不好)不仅以file://开头,而且以file:// localhost开头,而原始文件刚刚以实际路径开头(即:file:///用户)。

4

4 回答 4

10

好吧,经过大量研究并从头开始重新创建一个基本的 QuickLook 查看器,我发现即使从该查看器中仍然会记录错误,但实际上显示的文档并非来自我的原始项目。

然后,我尝试将 QLPreviewController 放入 NavigationController 中,然后再呈现它并最终遇到同样的问题。在呈现之前,我将 QLPreviewController 包装在 UINavigationController 中,因为这似乎是为 navigationItem 分配自定义按钮的方式。这在 iOS 5.1 中运行良好(如上所述),但显然 iOS 6.0 不喜欢这样。

删除将 QLPreviewController 包装在 UINavigationController 中的额外代码似乎允许显示文档。

控制器被包装的示例:

QLPreviewController* previewer = [[QLPreviewController alloc] init];
previewer.dataSource = self;
previewer.delegate = self;
[previewer setCurrentPreviewItemIndex:0];

UINavigationController* previewNavCtrl = [[UINavigationController alloc] init];
[previewNavCtrl pushViewController:previewer animated:NO];

[self presentModalViewController:previewNavCtrl animated:YES];

改成:

QLPreviewController* previewer = [[QLPreviewController alloc] init];
previewer.dataSource = self;
previewer.delegate = self;
[previewer setCurrentPreviewItemIndex:0];

[self presentModalViewController:previewer animated:YES];

注意:代理错误似乎仍然出现在日志中

另外:如果没有 NavigationController,任何 UIBarButtonItem 自定义似乎都不再起作用 =/

更新:我发现使用 fileURLWithpath 为 previewItemAtIndex 生成 fileURL 使原来的错误消失了。但是,在无法加载文档的地方仍然会出现同样的问题。

一个新错误(我见过其他人也有)是:

无法为路径发出文件扩展名:/Users/me/Library/Application%20Support/iPhone%20Simulator/6.0/Applications/339DDF48-AF93-41B5-B81E-A39440A131C6/Documents/temp/Welcome1.docx

最后更新:好的,扩展问题/错误是因为我试图手动将 %20 添加到空间(使用[NSString stringByAddingPercentEscapesUsingEncoding]等),而[NSURL fileURLWithPath]必须已经处理了。一旦我删除了它,它就起作用了,我现在使用的是 iOS 6 耶!所以真正的问题与 UINavigationController 无关,而实际上是通过 previewItemAtIndex 传递的文件 URL。

于 2012-10-04T20:46:36.413 回答
1

如果有人面临同样的问题,我想回答这个老问题。

当您使用 Xcode 调试应用程序时,每次应用程序的 UUID 都会发生变化。但这不适用于从设备加载应用程序时。

例如:我得到了同一个应用程序的以下路径。

文档路径:file:///var/mobile/Applications/CBF533A7-C19A-4336-A92C-DC1A48242A8A/Documents/ 文档路径:file:///var/mobile/Applications/ADB99D3B-EACA-482D-BB8A-0C12B340A044/文件/

这可以通过在- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index

NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES ) objectAtIndex:0];
NSURL *localDocumentsDirectoryURL = [NSURL fileURLWithPath:documentsDirectoryPath];
NSURL *fileURL =  [localDocumentsDirectoryURL URLByAppendingPathComponent:fileName isDirectory:NO];
return fileURL;

*fileName 只是文件名 (medoc.pdf),您可以在 Document 文件夹中找到该文件名。

于 2014-09-08T11:12:03.500 回答
0

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


For showing the Pdf :



QLPreviewController* preview = [[QLPreviewController alloc] init];
        preview.dataSource = self;
        [self presentModalViewController:preview animated:YES];





QLPreviewController delegate methods are :




- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller
{
    return 1;
}

- (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index
{

    return [NSURL fileURLWithPath:local_location];


}
于 2012-12-13T12:18:05.133 回答
0

1)

NSMutableArray * samplepdf = [[NSMutableArray alloc]initWithObjects:@"sam1.pdf",@"sam2.pdf",@"sam3.pdf",@"sam4.pdf", nil];

//将pdf文件拖入强文本文档目录

2)

QLPreviewController *previewController = [[QLPreviewController alloc] init]; previewController.dataSource = self; previewController.currentPreviewItemIndex = [indexPath 行]; [self presentModalViewController:previewController Animation:YES];

3) #pragma 标记 QLPreviewControllerDataSource

// 返回预览控制器应预览的项目数

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)previewController {

返回[样本pdf计数];

}

// 返回预览控制器应该预览的项目

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)index {

NSString *documentsDirectoryPath = [[NSBundle mainBundle]resourcePath];

NSString *dataPath =[documentsDirectoryPath stringByAppendingPathComponent:[samplepdf objectAtIndex:index]];

NSURL *url = [NSURL fileURLWithPath:dataPath isDirectory:YES];  
return url;

}

于 2013-01-08T12:51:49.260 回答