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.pswp.cn/news/394607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394607.shtml
英文地址,請注明出處:http://en.pswp.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注入構造語句…