我正在尝试在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];
}
答案 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的文件路径已更改。 因此,如果您使用较旧的捆绑路径来访问资源,则可能会出现问题。
我们对此进行了调查,事实证明:
例如,我们的问题是我们的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传递给数据源来解决此问题。