Quicklook / QLPreviewController在ios 8上显示空白页而不是pdf,但在iOS7上正常工作
我正在尝试在QLPreviewController中预览pdf文件并使用下面的代码。 它适用于iOS7和iOS8上的其他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
设置为一个新值。