iOS - 通过 Quicklook 打开 PDF 而不使用 UIScrollView

Posted

技术标签:

【中文标题】iOS - 通过 Quicklook 打开 PDF 而不使用 UIScrollView【英文标题】:iOS - Opening a PDF via Quicklook without using UIScrollView 【发布时间】:2011-04-28 13:16:55 【问题描述】:

我正在尝试通过 QuickLook 框架打开 PDF,而不使用 UIScrollView...

我相信我错过了什么......

我认为我出错的地方是我需要使用 QLPreviewController,而 QLPreviewController 上的数据源必须符合 QLPreviewItem。文档指出 NSURL 确实符合 QLPriewItem 所以我将 preview.dataSource 设置为抛出错误的 NSURL:

[NSURL numberOfPreviewItemsInPreviewController:]:无法识别的选择器发送到实例

由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“-[NSURL numberOfPreviewItemsInPreviewController:]:无法识别的选择器已发送到实例 0x5b5f200”

这让我觉得 NSURL 不符合。

所有我认为必要的代码......

- (BOOL)previewController:(QLPreviewController *)controller shouldOpenURL:(NSURL *)url forPreviewItem:(id <QLPreviewItem>)item 

    return YES;


- (NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller 

    return [documents count];


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

    return [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[documents objectAtIndex:index] ofType:nil]];


- (void)pushPDF 

    QLPreviewController *preview = [[QLPreviewController alloc] init];
    preview.dataSource = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"MCIT_Quiz" ofType:@"pdf"]];
    //preview.currentPreviewItemIndex = 0;
    [self presentModalViewController:preview animated:YES];
    [preview release];

【问题讨论】:

【参考方案1】:

我最终只是创建了另一个类来保存我的值并用作数据源,有点快速和肮脏,但它有效。

//
//  documentList.h
//

#import <Foundation/Foundation.h>
#import <QuickLook/QuickLook.h>


@interface DocumentList : NSObject <QLPreviewControllerDataSource, QLPreviewControllerDelegate> 
    NSArray *documents;


@property (nonatomic, retain) NSArray *documents;

-(void)createList;
-(NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller;
- (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index;

@end

插入文本以分解文件

//
//  documentList.m
//

#import "DocumentList.h"

@implementation DocumentList

@synthesize documents;

-(void) createList 

    documents = [[NSArray arrayWithObjects:@"Quiz.pdf", nil] retain];


-(NSInteger) numberOfPreviewItemsInPreviewController: (QLPreviewController *) controller 

    return [documents count];


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

return [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[documents objectAtIndex:index] ofType:nil]];


@end

【讨论】:

如果你真的只有一个,那何不把文件去掉,直接返回1,把quiz.pdf放到previewItemAtIndex中 这行得通吗?文档说明它需要一个 int 而不是那里的文件名。 啊,我明白你的意思了。 Quiz.pdf 是动态的,上面只是一个简单的例子。 @Mytheral - 我在看这个答案,因为我有同样的问题。我刚刚开始处理这个问题,你能告诉我这些方法的实际调用方式/位置吗?【参考方案2】:

嗯,我看不到 NSURL 符合 QLPreviewControllerDataSource 的地方。我想你想要

 preview.dataSource = self;

然后您已经编写的例程(numberOfPreviewItemsInPreviewController 和 previewController)将返回适当的 NSURL(尽管不清楚“文档”是如何填充的。)。

【讨论】:

当类本身符合时,它会起作用......但这就是我试图不做的事情。 好吧,我认为我的观点仍然正确,即您的代码必须是提供预览项目的数据源,无论您是否选择将其分解到另一个类中。 谁能告诉我如何自定义这个(QLPreviewController)?我想在这里为用户提供一些选项,例如文本搜索、打印以及下一个和上一个按钮。

以上是关于iOS - 通过 Quicklook 打开 PDF 而不使用 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

在 Finder 中预览 iOS 文档,无需编写 Mac quicklook 插件

iOS 6.0 Quicklook QLPreviewController错误,带有:“找不到加载的代理的预览项目”

ios在项目中打开word文档ppt等总结

无法使用 QuickLook 预览文件

USDZ 模型在 SceneKit 中有孔,但在 QuickLook 中没有

我们可以在 iOS 上使用 UIWebView 打开 pdf 文件吗?