iOS SDK:预览和打开文档

翻译自:点击打开链接

iOS中沙盒机制使iOS平台更安全,也使这个平台的使用者受益。然而,由于沙盒的严格限制,在不用应用间共享数据不是微不足道的。一个经常被忽视,被用来帮助共享文档的类是UIDocumentInteractionController类。在这个简易教程中,我将向你展示,如何使用这个类来预览文档和在设备上安装的应用中打开这个文档。

和文件交互

我必须承认,有点吃惊的发现这个自iOS3.2的UIDocumentInteractionController类。这个UIDocumentInteractionController类有着灵活的应用,并且比我们想象中的要强大。不禁惊是它允许开发者使用设备上安装的其它应用来打开文件,而且它也支持预览、打印、邮件,和复制文档。

使用UIDocumentInteractionController是很简单的。第一步是调用其唯一的类方法interactionControllerWithURL:来创建一个实例,传递你打算处理文档的URL(NSURL)。在设置了文件交互控制器的代理属性后,你要实现其相应地代理方法。

需注意的是UIDocumentInteractionController不是UIViewController的子类。换句话说,即使文件预览是通过UIDocumentInteractionController的,你也不得不文件交互控制器那个控制器是用来预览文件的。这点在我们创建这个示例之后,将会更清晰。我将向你展示:(1)预览文档和(2)在一个支持文档类型的应用中打开文档。

第一步:创建工程

如前所述,我们的示例将会预览文件和在另一个应用中打开文件。后者是相当有用的,如果你想给用户更大得灵活性,来处理存储在应用中的数据。一个常见的例子就是一个图片编辑应用中打开图片,例如iPhoto。

通过选择的Single View Application模板来创建一个新的工程(如图1)。把应用命名为Documents,输入公司的标识,在设备中选择iPhone,勾上Use Automatic Reference Counting。剩下的勾选可以不用选中(如图2)。选择在哪儿保存工程文件,点击create按钮。


图1


图2


第二步:创建用户界面

我们应用的界面包含两个按钮,一个用来预览PDF文档,一个用来打在另一个应用中打开PDF文档。在创建界面之前,在控制器中创建每个button对应的动作,如下所示:

- (IBAction)previewDocument:(id)sender {
 
}

- (IBAction)openDocument:(id)sender {
 
}

选中MTViewController.xib,从对象库中拖两个UIButton实例到右边的控制器的view上(图3)。在左边选择File's Owner对象,打开Connections Inspector,给button连接上我们刚才创建的动作(图4)。在Interface Builder中所要做的就是这。


图3


图4


第三步:预览文档

我们将要处理的文档是个PDF文档。你可以使用任何PDF文档,但我已经加入了一个示例文档。它是 Apple's iOS Programming Guide,你也可以在网络上找到它。把这个文档拖进你的工程中,并把Copy items into destination group's folder (if needed)这个选项的勾上(图5)。而且要确保文件被加入到Documents target中(图5)。


图5

当使用UIDocumentInteractionController类时,有两点要牢记。

1.需要一个对文件交互控制器的引用。

2.UIDocumentInteractionControllerDelegate 协议需要实现。

如下所示更改控制器的头文件,告诉编译器遵守UIDocumentInteractionControllerDelegate协议。

#import <UIKit/UIKit.h>
 
@interface MTViewController : UIViewController <UIDocumentInteractionControllerDelegate>
 
@end

在控制器的实现文件中,加入一个UIDocumentInteractionController的私有属性,把它命名为documentInteractionController。这个属性将会引用我们将使用的文件交互控制器。

现在来实现previewDocument:方法。开始,我们获取文档的URL(NSURL)。因为文档是应用bundle的一部分,获取文档的URL很简单,使用NSBundle类的方法即可。

- (IBAction)previewDocument:(id)sender {
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
 
    if (URL) {
        // Initialize Document Interaction Controller
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
 
        // Configure Document Interaction Controller
        [self.documentInteractionController setDelegate:self];
 
        // Preview PDF
        [self.documentInteractionController presentPreviewAnimated:YES];
    }
}

如果获取到了有效的URL,我们初始化一个UIDocumentInteractionController类,并传递文档的URL。在documentInteractionController属性中保存这个引用。当前的控制器将会作为文件交互控制器的代理。调用文件控制器的presentPreviewAnimated:方法来展示PDF文件的预览。

如果现在编译运行应用,你会发现当预览按钮按下时,会没有效果。这是因为还有个代理方法需实现。在前面,我说要知道UIDocumentInteractionController是NSObject的子类,不是UIViewController的子类。我们需要告知文件交互控制器哪个控制器是用来预览文档的。UIDocumentInteractionControllerDelegate协议的一个代理方法是用来获取一个控制器来预览文档用的。这个代理方法是documentInteractionControllerViewControllerForPreview:。因为,我们想要在主控制中显示预览,所有返回self就好了,如下所示。这是说,文件交互控制器使用当前的控制器来预览PDF文档,它将会以模态的方法展示这个文件:

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller {
    return self;
}

当然,你可以修改documentInteractionControllerViewControllerForPreview:的实现来适合自己的需求。这个代理方法实现后,编译运行应用,如图6所示。注意你甚至可以把这个文档通过邮件来分享,打印,或者复制到剪贴板中。另外,也可以在其它的支持这中文件类型的第三方中来打开这个文档。点击右上角的按钮(图7)。


图6


图7


第四步:打开文档

在许多情况中,需要允许用户在另一个应用中来打开文档,而不仅仅是预览文档。在我们的例子中,需要实现openDocument:动作。如同openDocument:一样,获取PDF文档的URL,使用它创建一个UIDocumentInteractionController的实例。在设置代理后,通过presentOpenInMenuFromRect:inView:方法来展示菜单。传递的第一参数CGRect是button的frame,如同你再下面的代码中看到的:

- (IBAction)openDocument:(id)sender {
    UIButton *button = (UIButton *)sender;
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
 
    if (URL) {
        // Initialize Document Interaction Controller
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
 
        // Configure Document Interaction Controller
        [self.documentInteractionController setDelegate:self];
 
        // Present Open In Menu
        [self.documentInteractionController presentOpenInMenuFromRect:[button frame] inView:self.view animated:YES];
    }
}

为了测试openDocument:事件,需要在真机上来测试。原因很简单,操作系统需要检查哪些应用支持我们要打开的文件类型(UTI)。如果找不到文件类型对应的应用,它将不会展示一个Open In菜单,而在模拟器中正是如此。

为了测试这个功能,需确保你的设备上安装有支持PDF文档的应用,例如Dropbox 或者亚马逊的 Kindle


图8


总结

正如你所见,使用UIDocumentInteractionController类很容易来预览和打开文档。我推荐你研究下它的 class reference 和 UIDocumentInteractionControllerDelegate protocol. 如果有许多大型的文档或者复杂的流程,还需要用到更多地代理方法。

最终例子下载:点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值