本文转载至 http://www.cocoachina.com/newbie/basic/2013/0515/6212.html

iOS中的沙盒可以让平台更加的安全,这也是沙盒给用户带来的最主要好处。不过由于沙盒的严格限制,导致程序之间共享数据比较麻烦。一般在程序间共享文档可以通过UIDocumentInteractionControll

“”

 
阅读器

iOS SDK

 

iOS中的沙盒可以让平台更加的安全,这也是沙盒给用户带来的最主要好处。不过由于沙盒的严格限制,导致程序之间共享数据比较麻烦。一般在程序间共享文档可以通过UIDocumentInteractionController(该类经常被开发者忽略)。本文中,我将介绍如何使用这个类在其它程序(已经安装在设备中的程序)中预览和打开文档。
 
UIDocumentInteractionController在iOS 3.2中就已经存在了,使用起来非常灵活,功能也比较强大。它除了支持同设备上app之间的文档分享外,还可以实现文档的预览、打印、发邮件以及复制。
 
UIDocumentInteractionController的使用非常简单。首先通过调用它唯一的类方法interactionControllerWithURL:,并传入一个URL(NSURL),来初始化一个实例对象。之后设置一下这个view controller的delegate属性,并实现一些恰当的delegate方法。
 
注意,UIDocumentInteractionController并不是UIViewController的子类,所以必须通知document interaction controller使用哪个view controller来预览文档。
 
Step 1: 设置项目
在同设备app之间打开文档非常有用,一个常见的实例是在图片编辑器中打开图片,比如iPhoto。
 
在 Xcode中创建一个新项目,选择“Single View Application”模板(图1)。命名文档,键入公司标识符,Device选择iPhone,设备下边选择“Use Automatic Reference Counting”,其他两项不选(图2)。然后点击“Next”,保存项目,点击“Creat”按钮。


图1

图2

Step 2: 创建用户界面
这个程序的用户界面包括两个按钮,一个是用于在其他app中预览PDF文档,另一个是用户在其他app中打开PDF文档。创建用户界面之前,在view controller执行文件中为每个按钮赋予一个动作,如下:
1.- (IBAction)previewDocument:(id)sender {
2.}
 
1.- (IBAction)openDocument:(id)sender {
2.}
 
选择MTViewController.xib,我们需要从右边view controller视图中拖拽两个UIButton实例(图3)。选择左边的File’s Owner objectobject,打开Connections Inspector,把先前创建的动作和按钮连接起来(图4)。


图3

图4

Step 3:预览文档
现在支持的是PDF文档,你可以使用任何PDF文档,但是在关于这个技巧的源文件中,我已经包含了一个PDF例子,就是苹果的iOS编程指南,也可以在线获得。把文档拖至你的项目中,选中“ Copy items into destination group’s folder (if needed)”这个复选框(图5),最后确保文件已经添加至下边的“Documents target”中。


图5

使用UIDocumentInteractionController类注意事项:1. 你需要保存着document interation controller的实例。2.需要实现UIDocumentInteractionControllerDelegate协议。
 
首先更新view controller的头文件(如下所示)来告诉compiler,MTViewController类遵照UIDocumentInteractionControllerDelegate协议。
1.#import <UIKit/UIKit.h>
2.@interface MTViewController : UIViewController <UIDocumentInteractionControllerDelegate>
3.@end
 
在view controller的实现文件中,添加一个私有属性,类型为UIDocumentInteractionController,并将名称命名为documentInteractionController。这个属性存储着document interaction controller,之后会用着。
 
看看previewDocument:方法的实现,首先获得文档的URL (NSURL) ,由于文档是app的一部分,因此通过NSBundle类获得文档的(NSURL)非常容易,如下:
 
1.- (IBAction)previewDocument:(id)sender {
2.    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
3.    if (URL) {
4.        // Initialize Document Interaction Controller
5.        self.documentInteractionController = [UIDocumentInteractionController 
interactionControllerWithURL:URL];
6.        // Configure Document Interaction Controller
7.        [self.documentInteractionController setDelegate:self];
8.        // Preview PDF
9.        [self.documentInteractionController presentPreviewAnimated:YES];
10.    }
11.}
 
如果返回了一个有效的URL,我们初始化一个UIDocumentInteractionController的实例,并且通过文档的URL。在documentInteractionController的属性中我们存储了一个document interaction controller的引用。view controller将会充当document interaction controller的delegate
 
如果现在运行app,你会注意到点击预览按钮时,什么都没有发生。因为这里我们首先要实现一个delegate method。
 
前边提到,UIDocumentInteractionController类并不是UIViewController的子类,而是继承自NSObject。我们需要通知document interaction controller使用哪个view controller进行文档预览。
 
UIDocumentInteractionControllerDelegate中有一个名documentInteractionControllerViewControllerForPreview:的delegate方法,该方法请求获得一个用于显示(预览)文档的view controller。
 
我们希望在main view controller中显示预览,所以可简单的返回self,如下代码所示。它的意思是document interfation controller将使用我们的view controller来预览PDF文档——以modal view的方式显示文档。
 
1.- (UIViewController *) documentInteractionControllerViewControllerForPreview: 
(UIDocumentInteractionController *) controller {
2.    return self;
3.
 
当然你可以简化documentInteractionControllerViewControllerForPreview:的实现以满足你的需要。执行委托方法的同时,你可以首次运行app,试试看这个效果(图6),你可以通过邮件分享这个文档,可以打印或者复制。另外,也可以在支持该文档类型的其他app中打开文档,在图7中点击右边的按钮,看看我说的什么意思。


图6

图7

Step 4: 打开文档
为了实现这一目的我们需要实现openDocument:方法。在previewDocument: 方法中,获取到在程序bundle中一个PDF文件的url,用这个url初始化一个UIDocumentInteractionController。

之后设置一下UIDocumentInteractionController的delegate,在这个UIDocumentInteractionController中调用presentOpenInMenuFromRect:inView:方法显示一个菜单。传入的第一个参数CGRect是button的frame,如下所示:
1.- (IBAction)openDocument:(id)sender {
2.    UIButton *button = (UIButton *)sender;
3.    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];
4.    if (URL) {
5.        // Initialize Document Interaction Controller
6.        self.documentInteractionController = [UIDocumentInteractionController 
interactionControllerWithURL:URL];
7.        // Configure Document Interaction Controller
8.        [self.documentInteractionController setDelegate:self];
9.        // Present Open In Menu
10.        [self.documentInteractionController presentOpenInMenuFromRect:[button frame] inView:self.view animated:YES];
11.    }
12.}
 
为了测试openDocument:方法,在真机上运行实例app非常重要。原因很简单,操作系统要检查安装的app是否支持我们要打开的文件类型(UTI)。如果没有找到支持相应文件类型的app,那么菜单中就不会有打开的提示,而这个不能通过iOS模拟器进行测试。
 
为了测试这个功能,首先要在真机上安装支持PDF的app,比如Dropbox或者Amazon的Kindle app。


图8

总结
使用UIDocumentInteractionController这个类可以简单地实现app之间文档的预览和打开。建议你去看看这个类的参考文档,特别是UIDocumentInteractionControllerDelegate协议——这里面有许多delegate

方法,当遇到大文档或者复杂的工作流时,这些方法都非常的方便。

源文件:

/cms/uploads/soft/130515/4196-130515163Q2.zip

在其他app里预览文档的更多相关文章

  1. C#在线预览文档(word,excel,pdf,txt,png)

    C#在线预览文档(word,excel,pdf,txt,png) 1.预览方式:将word文件转换成html文件然后预览html文件2.预览word文件:需要引入Interop.Microsoft.O ...

  2. C# 基于NPOI+Office COM组件 实现20行代码在线预览文档(word,excel,pdf,txt,png)

    由于项目需要,需要一个在线预览office的功能,小编一开始使用的是微软提供的方法,简单快捷,但是不符合小编开发需求, 就另外用了:将文件转换成html文件然后预览html文件的方法.对微软提供的方法 ...

  3. 【iOS功能实现】之利用UIDocumentInteractionController打开和预览文档

    iOS提供了使用其他app预览文件的支持,这就是Document Interaction Controller.此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件.而且,从4.2开始, ...

  4. iOS-UIDocumentInteractionController打开和预览文档

    iOS提供了使用其他app预览文件的支持,这就是Document Interaction Controller.此外,iOS也支持文件关联,允许其他程序调用你的app打开某种文件.而且,从4.2开始, ...

  5. [SWF]在线预览文档下载

    写本文的缘由:领导有些项目文档需要审阅,网站上的文档只能在线预览,没有提供下载.开始用截屏的方式,可想而知这将会是多大的重复性劳动.所以研究了一下,发现可以曲线救国,所以在这里分享一下. 问题描述:这 ...

  6. 在线预览文档(支持word、excel、ppt、pdf)+在线预览文档html版(转)

    1.首先上网搜索一下有什么解决方案 (1).将文档转换为html,只支持支持office文档 (2).将文档转换为flash,实现类似百度文库的效果,除支持office文档外还支持pdf (1) a. ...

  7. iOS利用UIDocumentInteractionController和Quick Look打开或预览文档

    在App的开发过程中,我们避免不了要打开软件中的文件,例如:Excel文件,Word文件,图片文件等不同格式的文件或者想要通过第三方的App来打开这些文件,那么我们就要用到UIDocumentInte ...

  8. 【微信小程序】下载并预览文档——pdf、word、excel等多种类型

    .wxml文件 <view data-url="https://XXX/upload/zang." data-type="excel" catchtap= ...

  9. Java 如何实现在线预览文档及修改(Office文件)

    测试地址: https://sms.idxkj.cn 用户名:aa 密码:123456

随机推荐

  1. Directive Controller And Link Timing In AngularJS

    I've talked about the timing of directives in AngularJS a few times before. But, it's a rather compl ...

  2. iOS适配整理

    iOS12适配问题 1.StatusBar内部结构改变 现象:crash crash log: -[_UIStatusBarIdentifier isEqualToString:]: unrecogn ...

  3. B1:模板方法模式 TemplateMethod

    定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤 应用场景: A.操作步骤稳定,而具体细节延迟到子类. UML: 示例代码: ...

  4. LoadRunner测试Google Suggest

    Google的搜索框是典型的AJAX应用,用户在输入关键字的同时,前端页面通过xmlhttp与后台服务器动态交互,根据用户输入的关键字查找匹配的内容,向用户提示建议的搜索项,也就是所谓的“google ...

  5. Mysql中获取行号

    Select UID,(@rowNum:=@rowNum+1) as rowNo From a, (Select (@rowNum :=0) ) b Order by a.Money Desc

  6. 冲销会计凭证:FBRP与FB08的区别

    FBRA一般是用来对已经清帐的凭证进行冲销的,我们知道普通的冲销只要用FB08就可以了,但是对于已经被清帐和凭证,我们只能用FBRA来进行清帐,我们来按以下的没测试来做验证一下.STEP1:用F-22 ...

  7. TCP/IP ---互联网的地址

    互联网上的每个接口必须有一个唯一的I n t e r n e t地址(也称作I P地址). I P地址长32 bit.I P地址具有一定的结构,五类不同 的互联网地址格式如图1 - 5所示. 这些3 ...

  8. ASP.NET MVC4空MVC项目添加脚本压缩和合并

    本文介绍的是 建立的空MVC项目如何添加该功能 1.选中MVC项目,右键>"管理解决反感的NuGet程序包" 2.在"联机"中在线搜索搜索"Op ...

  9. Atitit.软件开发的非功能性需求attilax 总结

    Atitit.软件开发的非功能性需求attilax 总结 1. 运行环境约束:用户对软件系统运行环境的要求. 1 2. 兼容性 2 3.   7.6 数据库 database (imp by ati) ...

  10. boost中全局命名锁的使用

    使用头文件相对位置为:boost/interprocess/sync/named_mutex.hpp 在程序中使用 boost::interprocess::named_mutex g_namedmu ...