Quicklook / QLPreviewController在ios 8上显示空白页而不是pdf,但在iOS7上正常工作

我正在尝试在QLPreviewController中预览pdf文件并使用下面的代码。 它适用于iOS7iOS8上的其他types的文件(JPG / PNG),但是当我尝试打开PDF时,它显示空白页,而不是iOS8上的内容。 奇怪的是它仍然在标题视图中显示pdf的名称。

码:

QLPreviewController *previewer = [[QLPreviewController alloc] init]; previewer.dataSource = self; previewer.currentPreviewItemIndex = 0; [self presentViewController:previewer animated:NO completion:nil]; 

和QLPreviewControllerDataSource方法:

 - (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { return 1; } - (id<QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { return [NSURL fileURLWithPath:self.pdfUrl]; } 

这实际上是iOS 8 Beta 5中的一个已知问题。

查看QuickLook下的URL https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/

在UINavigationController中放置一个QLPreviewController似乎有一个bug。 即使文档被加载,它也只是显示为黑色视图。

 UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:previewController]; [self presentViewController:navController animated:YES completion:nil]; 

解决scheme是使用导航控制器。 QLPreviewController无论如何都会覆盖导航栏。

 [self presentViewController:previewController animated:YES completion:nil]; 

这里可能涉及两件事情。

对于那些在UINavigationController中实现QLPreviewController的人来说,可能有一个问题。

对于那些仍然没有UINavigationController的问题,请继续阅读。

在iOS 8.0中,数据的文件path已更改。 所以,如果你使用旧的包path来访问你的资源,你可能会遇到一个问题。

我们确实调查了这一点,事实certificate:

  • 您需要密切注意文档目录的完整path
  • 如果不创buildQLPreviewController,则不能在此Documents目录的子文件夹中显示文件。

例如,我们的问题是我们的PDF文件是使用传统的“打开”从外部应用程序打开的。

这导致文件被复制到应用程序的Documents目录内的收件箱目录。

无论QLPreviewController是否embedded在UINavigationController中,文件IS都能在模拟器上正确显示。

该文件不能正确显示在真实的iOS设备上。

在将文件URL发送到QLPReviewController之前,我们没有将文件复制到Documents目录的根目录,将这个新的URL传递给QLPreviewController。 然后宾果,它的工作。

所以为了解决这个问题,请确保将资源复制到您实际拥有的目录中。 直到有人可以解释如何玩弄收件箱(可能共享)目录的权利。

如果你迫切需要使用embedded到UINavigationController中的QLPreviewController,请使用下面的代码:

 #import <Quicklook/QLPreviewController.h> ... QLPreviewController *pc = [[QLPreviewController alloc] init]; pc.delegate = self; pc.dataSource = self; UINavigationController *nc = [[UINavigationController alloc] init]; nc.view.backgroundColor = [UIColor whiteColor]; nc.navigationBarHidden = YES; [self presentViewController:nc animated:YES completion:nil]; [nc pushViewController:pc animated:NO]; 

我最近刚刚遇到一个空白页面,我发现原因是我做了类似的事情

 previewController.dataSource = [[MyDataSource alloc] initWithSomething]; 

由于QLPreviewController将其数据源保存为弱variables,因此数据源立即消失。

保持对dataSource的有力参考。

在iOS8.1上和我一起工作的很好

确保您将doc文件下载到适当的文件path中

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [paths objectAtIndex:0]; urlString = [urlString stringByReplacingOccurrencesOfString:@"/" withString:@""]; filePath = [cachePath stringByAppendingPathComponent:urlString]; BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath]; if (fileExists == NO) { NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:mainPadfLink]]; [pdfData writeToFile:filePath atomically:YES]; } 

并将其加载到您的QLPreviewControl

 - (id <QLPreviewItem>)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { return [NSURL fileURLWithPath:filePath]; } 

并确保你用presentViewController打开QLPreviewControl不要把它推入你的导航控制器

对于iOS 9.2:在Monotouch.ios中,

使用

 var url = NSUrl.FromFilename(NSBundle.MainBundle.PathForResource ("pdf.pdf", null)); 

代替

 var url = NSUrl.FromFilename("pdf.pdf"); 

它将适用于所有文件。 (JPG,PNG,PDF等)

我有同样的问题,我需要调用reloadData()后,我将dataSource设置为一个新值。