ios开发之--UIDocumentInteractionController的使用(实现更多分享服务)

最近在做项目的时候,碰到这样一个需求,就是本地生成pdf文件,然后本地打开,经过测试发现,pdf文件是无法保存到相册里面的,只能存到手机里面,鉴于苹果的存储机制,需要取出来,进行本地展示,可以直接传到后台生成一个链接,直接在webview和浏览器里面打开,但是效果并不好,加载也慢些,所以就想到了用通过UIDocumentInteractionController来实现本地查看的操作,具体代码如下:

1,简介

UIDocumentInteractionController是从ios 3.2的sdk开始支持的,他是直接继承自NSObject,因此需要UIDocumentInteractionController提供的方法来展示他,UIDocumentInteractionController主要给我们提供了三种用途:

 1 展示一个可以操作我们分享的文档类型的第三方App列表
 2 在第一条展示列表的基础上添加额外的操作,比如复制,打印,预览,保存等。
 3 结合Quick Look框架直接展示文档内容

2,简单的布局就不说了,直接上主要代码:

初始化:

- (IBAction)shareClick:(id)sender {
    UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[[NSBundle mainBundle] URLForResource:@"MyFile" withExtension:@"pdf"]];
}

实现一个UIDocumentInteractionController的方法:

- (BOOL)presentOpenInMenuFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated;

在上面的button的点击方法里面再加入此方法:

UIDocumentInteractionController *documentController = [UIDocumentInteractionController interactionControllerWithURL:[[NSBundle mainBundle] URLForResource:@"MyFile" withExtension:@"pdf"]];
    [documentController presentOpenInMenuFromRect:self.view.bounds inView:self.view animated:YES];

然后运行工程,进行测试,点击button,就可以看到如下界面:

这里我做了本地的汉化处理,真机上会显示汉字,具体请参考我写的“系统控件汉化”的博客。

简单介绍下这个界面:

第一行列表显示“AirDrop”是苹果在iOS 7提供的一种跨设备分享的技术;

第二行列表展示整个iOS系统中,可以操作PDF文档的应用程序列表,还包括了苹果在iOS 8提供的Share Extension图标;

第三行列表展示现实设备可选的操作,如Copy,Print等;

这个时候,点击分享到微信,这个时候,会发现崩溃了,错误信息如下:

根据错误提示,“***has gone away prematurely”过早的消失,在ARC环境下,方法走完之后,UIDocumentInteractionController的实例被释放了,展示出来的这个view是有Quick Look框架来操作,不会对UIDocumentInteractionController产生引用,所以当点击button的时候,内部操作仍然会继续访问这个实例,所以就会报过早的消失这个错误!

解决方法:把UIDocumentInteractionController声明为一个强指针strong类型的实例,然后修改下button的触发方法即可:

@property(nonatomic,strong)UIDocumentInteractionController *documentController;

方法写成私有方法:

-(void)presentOpenInMenu{    [_documentController presentOpenInMenuFromRect:self.view.bounds inView:self.view animated:YES];}

最终代码:

- (IBAction)shareClick:(id)sender {
    _documentController = [UIDocumentInteractionController interactionControllerWithURL:[[NSBundle mainBundle] URLForResource:@"MyFile" withExtension:@"pdf"]];

    [self presentOpenInMenu];

}

这样就解决了!

展示可选操作,实现此方法即可:

- (BOOL)presentOptionsMenuFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated;

封装私有方法:

-(void)presentOptionsMenus
{
    [_documentController presentOptionsMenuFromRect:self.view.bounds inView:self.view animated:YES];
}

然后在button点击方法里面替换成上述方法,效果如下图:

华丽丽的出现了!

直接预览

UIDocumentInteractionController第三种预览文档内容的用途就是重点,而且也很常见,例如微信里面和浏览器里面就是用了此种方法,很是方便。

实现预览效果也很方便,实现一个代理方法即可:

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller;

此代理方法主要是用来指定UIDocumentInteractionController要显示的视图所在的父视图,这样UIDocumentInteractionController才知道在哪里展示Quick Look预览内容,当然了,这里是指定button所在的VC来做UIDocumentInteractionController的代理对象,添加如下代码:

@interface ViewController ()<UIDocumentInteractionControllerDelegate>
_documentController.delegate = self;

实现代理方法:

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

UIDocumentInteractionController是继承自NSObject的,因而为了能够实现直接预览,我们需要用到UIDocumentInteractionController提供的展示预览的方法:

- (BOOL)presentPreviewAnimated:(BOOL)animated;

私有方法:

-(void)presentPreview
{
    [self.documentController presentPreviewAnimated:YES];
}

在button点点击事件里面添加上此方法即可,效果如下:

这样所要展示的pdf文件,就华丽丽的展示了出来!

参考自:http://www.jianshu.com/p/3f03897cf98a

时间: 2024-10-19 04:16:29

ios开发之--UIDocumentInteractionController的使用(实现更多分享服务)的相关文章

IOS开发-你不可缺少的资源汇总-知识分享-转

如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://github.com/carlbrown/PDKeychainBindingsController 对焦功能的实现: http://www.clingmarks.com/?p=612 自定义圆角Switch按件: https://github.com/domesticcatsoftware/DCRou

IOS开发-你不可缺少的资源汇总-知识分享(2)-转

手势表格: https://github.com/mystcolor/JTGestureBasedTableViewDemo 线图: http://www.cocoachina.com/bbs/read.php?tid-34137.html 饼图: http://www.cocoachina.com/bbs/read.php?tid-33615.html 柱状图: http://www.cocoachina.com/bbs/read.php?tid-9462-toread-1.html 图表框架

ios开发新手浅谈强大的runtime机制

runtime机制,实际上是一套底层的C语言代码,里面提供了很多的C数据类型和一些功能强大的C语言函数.我们所写的OC代码,在底层都是基于runtime来实现的.所以我们可以说OC实际就是披着面向对象外衣的C语言,因为在运行时,OC代码会编译成C/C++ 来运行.runtime中有很多的C函数,有着很强大的功能,比如 : 1. 能动态类的增删改 成员变量,方法 2.IOS Swizzle 能底层动态的交换两个方法(类方法和对象方法)的实现 IOS swizzle的具体做法: 1.在分类的load

如何成为一名优秀的iOS开发工程师

如果你是一位专业的iOS开发工程师,你应该为自己感到自豪.因为你能在强大的iOS系统下,一展身手实现自己和他人的想法,这是一件令人无比激动的事情. 作为一名iOS开发工程师,你一定想成为行业的佼佼者.那么,如何成为一名优秀的iOS开发工程师呢?我觉得做到以下几点,你就离优秀越来越近了. 提高英语水平 作为码农,英语水平虽然不是一个硬指标,但是,如果你的英语水平足够好,那真是如虎添翼.在公司里面,糟糕的英语表达能力也掩盖了你在软件开发技术上的优势. 很多优秀的技术文章都是英文版本的,就像苹果官方文

如何成为一名优秀的 iOS 开发工程师

如果你是一位专业的iOS开发工程师,你应该为自己感到自豪.因为你能在强大的iOS系统下,一展身手实现自己和他人的想法,这是一件令人无比激动的事情. 作为一名iOS开发工程师,你一定想成为行业的佼佼者.那么,如何成为一名优秀的iOS开发工程师呢?我觉得做到以下几点,你就离优秀越来越近了. 提高英语水平 作为码农,英语水平虽然不是一个硬指标,但是,如果你的英语水平足够好,那真是如虎添翼.在公司里面,糟糕的英语表达能力也掩盖了你在软件开发技术上的优势. 很多优秀的技术文章都是英文版本的,就像苹果官方文

那些在学习iOS开发前就应该知道的事(part 1)

英文原文:Things I wish I had known before starting iOS development—Part 1 http://www.cocoachina.com/ios/20150608/12052.html 设计师设计出来了一个不错的引导界面,然而当我看到设计稿的时候,我们的app也没几天就要上线了.这个界面模仿了Evernote iOS app的风格. 我以迅雷不及掩耳盗铃之势开始在Xcode上编程,用了page view controller和scroll v

iOS开发 之 Action Extension

上一篇<iOS开发 之 Share Extension>介绍了分享扩展的开发与使用,本篇主要还是讲述在系统分享菜单中最底下一栏的功能扩展:Action Extension,该扩展跟Share Extension实现比较类似只是在使用场景上进行了区分,Share Extension主要用于将Host应用中的内容分享到Container应用中,而Action Extension则主要用于将Host应用中的内容进行对应处理,原则上来说作用范围比Share Extension要广. 那么,下面将详细讲

IOS 开发下拉刷新和上拉加载更多

IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh (4)MJRefresh (5)自己实现 2.AH3DPullRefresh实现下拉刷新和上拉下载的步骤 添加UIScrollView+AH3DPullRefresh.h 和UIScrollView+AH3DPullRefresh.m两个文件,由此可知,它是基于UIScrollView的方法. 在bu

【iOS开发每日小笔记(十三)】使用UIDocumentInteractionController 打开ibooks文档的注意点

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 大约两年多前,我曾尝试自己写一个程序,用来解析Word文档.当时满腔热血,认为只要是把xml各种标签一一对应解析就好了(当时还不知道有CoreText这档子东西).后来发现自己实力不够,在解析了图片.文字.