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

 

转载于:https://www.cnblogs.com/hero11223/p/7306104.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse tomcat新建一个_Javaweb07-Eclipse自动创建动态web项目

学习笔记是参考的how2j使用Eclipse创建Dynamic Web Project前面的web项目都是通过手动创建的&#xff0c;现在使用eclipse EE自动创建动态web项目&#xff0c;熟悉一下创建流程&#xff0c;仍旧使用前面创建过的HelloServlet。需要注意的是&#xff0c;这里的tomcat版本变了&am…

python 删除重复字符_Google面试问题指南:使用Python删除重复出现的字符

python 删除重复字符by Anthony Sistilli安东尼西斯蒂里(Anthony Sistilli) Google面试问题指南&#xff1a;使用Python删除重复出现的字符 (Google Interview Question Guide: Delete Reoccurring Characters with Python) Nowadays, Google interviews are all the rage. Bu…

cordova

命令行 npm install -g cordova cordova create MyApp cd MyApp cordova platform add android 当然也可以把android换成browser把自己的前端程序放在www文件夹内这里注意如果用android studio打包或运行的话&#xff0c;&#xff08;即不用cordova&#xff09;&#xff0c;要把…

冒泡排序(Java版)

冒泡排序基本思想&#xff1a; 1.比较相邻的元素&#xff0c;如果第一个比第二个大&#xff0c;就交换它们两个。 2.对每一对相邻元素做同样的工作&#xff0c;从开始的第一对到结尾的最后一对。在这一点&#xff0c;最后的元素应该会是最大的数。 3.针对所有的元素重复以上的步…

计算机科学与技术专业的论文周报,毕业设计(实习)周报

本科毕业设计周报第1 周毕业生周记撰写毕业论文开题报告(初稿)&#xff0c;结合毕业设计所选的题目&#xff0c;查阅大量相关资料&#xff0c;主要针对该设计所涉及的背景&#xff0c;研究目的及意义&#xff0c;以及国内外的相关成熟技术进行筛选&#xff0c;提取部分核心内容…

excel导出_SpringBoot实现快速导出Excel

阅读本文约需要6分钟 大家好&#xff0c;我是你们的导师&#xff0c;我每天都会在这里给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。上次老师跟大家分享了下MyBatis 几种通用的写法的相关知识&#xff0c;今天跟大家分享SpringBoot实现快速导出Exce…

SignalR Self Host+MVC等多端消息推送服务(4)

由于工作太忙&#xff0c;一直没时间更新博客&#xff0c;之前有很多朋友一直问我什么时候将后续的代码发上来&#xff0c;一直没时间&#xff0c;今天就长话短说&#xff0c;不写文章了&#xff0c;直接上demo&#xff0c;里面将正式项目中用到的一些敏感信息修改了&#xff0…

项目中需要总结的内容

1.铁塔项目的硬件总结 2.传感器项目的硬件总结 3.灯控项目的硬件总结 控制灯闪烁的电路&#xff0c;SIM卡板子复位电路&#xff0c;继电器控制电路转载于:https://www.cnblogs.com/yuesheng/p/6086647.html

计算机应用计算机电算化题库,2014年浙江省会计电算化客观题题库

第一套试题一、单选题1.在会计软件初始设置中&#xff0c;录入期初余额时(C)A&#xff0e;只要求录入一级科目的期初余额 B.只要求录入中间级科目的期初余额C&#xff0e;每级科目均需录入期初余额 D.只要求录入最末级科目的期初余额2.在总账系中&#xff0c;要求能够进行上下级…

使用一些我喜欢的东西开始使用ES6

by Todd Palmer托德帕尔默(Todd Palmer) 使用一些我喜欢的东西开始使用ES6 (Getting started with ES6 using a few of my favorite things) This tutorial walks you through some easy steps to get started learning the newest version of JavaScript: ES6.本教程将引导您…

A 子类继承父类,子类的构造函数会覆盖父类的构造函数

//子类 没有定义 构造 函数时&#xff0c;默认继承父类的构造方法&#xff1a;输出结果为 Class A... // 子类 定义了 构造 函数时&#xff0c;就不会继承父类的构造方法&#xff1a;输出结果是 Class B... <?php class A{ public function __construct(){ echo &qu…

fifo算法_缓存算法FIFO、LFU、LRU

阅读文本大概需要3分钟。0x01&#xff1a;FIFO算法FIFO(First in First out)&#xff0c;先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想&#xff0c;比如作业调度(先来先服务)&#xff0c;为什么这个原则在很多地方都会用到呢&#xff1f;因为这个原则…

Pile 0009: Vim命令梳理

正常模式&#xff08;按Esc或Ctrl[进入&#xff09; 左下角显示文件名或为空插入模式&#xff08;按i键进入&#xff09; 左下角显示--INSERT--可视模式&#xff08;按v键进入&#xff09; 左下角显示--VISUAL-- i 在当前位置生前插入 I 在当前行首插入 a 在当前位置后插入 A 在…

Introduction of Version Control/Git, SVN

Introduction of Version Control/Git, SVN 什么是版本控制&#xff1f; 你可以把一个版本控制系统&#xff08;缩写VCS&#xff09;理解为一个“数据库”&#xff0c;在需要的时候&#xff0c;它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照&#xff08;称之…

怎样设置计算机远程桌面,电脑如何设置远程连接,手把手教你如何远程

说起远程桌面很多用户都认为是从WIN2000 SERVER才开始引入的&#xff0c;实际上我们可以在WIN98甚至是DOS中看到他的身影。远程桌面采用的是一种类似TELNET的技术&#xff0c;他是从TELNET协议发展而来的。那么如何设置自动开机&#xff0c;下面&#xff0c;我们就来看看如何设…

查看这些有用的ECMAScript 2015(ES6)提示和技巧

by rajaraodv通过rajaraodv 查看这些有用的ECMAScript 2015(ES6)提示和技巧 (Check out these useful ECMAScript 2015 (ES6) tips and tricks) EcmaScript 2015 (aka ES6) has been around for couple of years now, and various new features can be used in clever ways. I…

inputstream转fileinputstream对象_FileInputStream类:文件字节输入流

API ----IO ----字节输入输出流练习 java.lang.Object 继承者 java.io.InputStream 继承者 java.io.FileInputStreampublic FileInputStream类速查速记&#xff1a;直接包装File用于从记事本中读数据 in是针对java来说的&#xff0c;从记事本读入到java* 构造方法&#xff1a;…

IBM将推NVMe存储解决方案

先前&#xff0c;IBM曾对外宣称将开发新的NVMe解决方案&#xff0c;并推动行业参与者进一步探索新协议&#xff0c;以支持更快的数据传输。周日&#xff0c;IBM表示新的语言协议——NVMe&#xff08;非易失性存储器&#xff09;正在逐步取代SAS和SATA等旧有的固态硬盘存储标准。…

html5中3个盒子怎样设置,Web前端开发任务驱动式教程(HTML5+CSS3+JavaScript)任务10 盒子模型及应用.pptx...

第五单元 盒子模型任务10 盒子模型及应用学习目标盒子模型的概念掌握边框的设置内边距的设置外边距的设置学习目标了解:利用盒子模型布局网页的优势任务目标实战演练——制作古诗文欣赏网页强化训练——制作散文赏析网页知识准备1. 盒子模型的概念知识准备1. 盒子模型的概念CSS…

SQL手工注入入门级笔记(更新中)

一、字符型注入 针对如下php代码进行注入&#xff1a; $sql"select user_name from users where name$_GET[name]"; 正常访问URL:http://url/xxx.php?nameadmin 此时实际数据库语句: select user_name from users where nameadmin 利用以上结果可想到SQL注入构造语句…