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

时间:2014-08-14 11:48:25

标签: ios pdf ios8 qlpreviewcontroller

我正在尝试在QLPreviewController中预览pdf文件并使用以下代码。它适用于 iOS7 以及 iOS8 上的其他类型文件(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];
}

9 个答案:

答案 0 :(得分:5)

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

请参阅QuickLook下的网址 https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-8.0/

答案 1 :(得分:5)

在UINavigationController中放置QLPreviewController时似乎存在错误。即使文档已加载,它也会显示为黑色视图。

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

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

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

答案 2 :(得分:4)

这里可能涉及两件事。

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

对于那些在没有UINavigationController的情况下仍有问题的人,请继续阅读。

在iOS 8.0中,Data的文件路径已更改。 因此,如果您使用较旧的捆绑路径来访问资源,则可能会出现问题。

我们对此进行了调查,事实证明:

  • 您需要密切关注获取文档目录的完整路径的方式
  • 如果你没有创建文件,QLPreviewController不能在这个Documents目录的子文件夹中显示文件。

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

这导致文件被复制到App的Documents目录中的Inbox目录。

无论QLPreviewController是否嵌入在UINavigationController中,文件都会在模拟器上正确显示。

文件无法在真实的iOS设备上正确显示。

在将文件URL发送到QLPReviewController之前,我们确实将文件复制到Documents目录的根目录,并将此新URL传递给QLPreviewController。 然后宾果游戏,它有效。

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

答案 3 :(得分:2)

如果您迫切需要使用嵌入在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];

答案 4 :(得分:2)

我刚刚再次遇到一个空白页面,我发现原因是我做了类似

的事情
previewController.dataSource = [[MyDataSource alloc] initWithSomething];

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

保持对dataSource的强大引用。

答案 5 :(得分:0)

在iOS8.1上与我合作

确保将doc文件下载到正确的文件路径

 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,不要将其推入导航控制器

答案 6 :(得分:0)

对于iOS 9.2: 在Monotouch.ios中,

使用

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

而不是

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

它适用于所有文件。 (jpg,png,pdf等)

答案 7 :(得分:0)

我遇到了同样的问题,在将reloadData()设置为新值后,我需要致电dataSource

答案 8 :(得分:0)

我遇到了一个问题(并且仍然有)从bundle(xCode 9.2,iOS 11)中呈现文档。它只显示图像。对于其他文档(pdf,key,rtf,pages,docx,txt ...),它只显示名称而不显示内容。我以模态方式呈现控制器,数据源的实现如下:

func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
    return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {

    let url = Bundle.main.url(forResource: "test", withExtension: "pdf")!


    if QLPreviewController.canPreview(url as NSURL) {
        print("This file can be previewed.")
    } else {
        print("This file can not be previewed.")

    }
     return url as NSURL
}

当然,它显示可以预览文件,但它不会预览它。目前我通过将文件复制到文档目录并将该URL传递给数据源来解决此问题。