http://mobile.tutsplus.com/tutorials/iphone/previewing-and-opening-documents-with-uidocumentinteractioncontroller/編程
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」模板。命名文檔,鍵入公司標識符,Device選擇iPhone,設備下邊選擇「Use Automatic Reference Counting」,其餘兩項不選。而後點擊「Next」,保存項目,點擊「Creat」按鈕。安全
Step 2: 建立用戶界面
這個程序的用戶界面包括兩個按鈕,一個是用於在其餘app中預覽PDF文檔,另外一個是用戶在其餘app中打開PDF文檔。建立用戶界面以前,在viewcontroller執行文件中爲每一個按鈕賦予一個動做,以下:
1.- (IBAction)previewDocument:(id)sender {
2.}
1.- (IBAction)openDocument:(id)sender {
2.}
選擇MTViewController.xib,咱們須要從右邊view controller視圖中拖拽兩個UIButton實例。選擇左邊的File’s Owner objectobject,打開Connections Inspector,把先前建立的動做和按鈕鏈接起來。app
Step 3:預覽文檔
如今支持的是PDF文檔,你可使用任何PDF文檔,可是在關於這個技巧的源文件中,我已經包含了一個PDF例子,就是蘋果的iOS編程指南,也能夠在線得到。把文檔拖至你的項目中,選中「 Copy items into destination group’s folder (ifneeded)」這個複選框,最後確保文件已經添加至下邊的「Documents target」中。iphone
使用UIDocumentInteractionController類注意事項:1. 你須要保存着document interation controller的實例。2.須要實現UIDocumentInteractionControllerDelegate協議。
首先更新viewcontroller的頭文件(以下所示)來告訴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 InteractionController
5. self.documentInteractionController= [UIDocumentInteractionController
interactionControllerWithURL:URL];
6. // Configure Document InteractionController
7. [self.documentInteractionControllersetDelegate: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。 咱們須要通知documentinteraction controller使用哪一個view controller進行文檔預覽。
UIDocumentInteractionControllerDelegate中有一個名documentInteractionControllerViewControllerForPreview:的delegate方法,該方法請求獲得一個用於顯示(預覽)文檔的viewcontroller。
咱們但願在main viewcontroller中顯示預覽,因此可簡單的返回self,以下代碼所示。它的意思是document interfation controller將使用咱們的view controller來預覽PDF文檔——以modal view的方式顯示文檔。
1.- (UIViewController *)documentInteractionControllerViewControllerForPreview:
(UIDocumentInteractionController *) controller {
2. return self;
3.
固然你能夠簡化documentInteractionControllerViewControllerForPreview:的實現以知足你的須要。執行委託方法的同時,你能夠首次運行app,試試看這個效果,你能夠經過郵件分享這個文檔,能夠打印或者複製。另外,也能夠在支持該文檔類型的其他app中打開文檔,在圖中點擊右邊的按鈕,看看我說的什麼意思。編輯器
Step 4: 打開文檔
爲了實現這一目的咱們須要實現openDocument:方法。在openDocument:方法中,獲取到在程序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 InteractionController
6. self.documentInteractionController= [UIDocumentInteractionController
interactionControllerWithURL:URL];
7. // Configure Document InteractionController
8. [self.documentInteractionController setDelegate:self];
9. // Present Open In Menu
10. [self.documentInteractionControllerpresentOpenInMenuFromRect:[button frame] inView:self.view animated:YES];
11. }
12.}
爲了測試openDocument:方法,在真機上運行實例app很是重要。緣由很簡單,操做系統要檢查安裝的app是否支持咱們要打開的文件類型(UTI)。若是沒有找到支持相應文件類型的app,那麼菜單中就不會有打開的提示,而這個不能經過iOS模擬器進行測試。
爲了測試這個功能,首先要在真機上安裝支持PDF的app,好比Dropbox或者Amazon的Kindle app。ui
總結
使用UIDocumentInteractionController這個類能夠簡單地實現app之間文檔的預覽和打開。建議你去看看這個類的參考文檔,特別是UIDocumentInteractionControllerDelegate協議——這裏面有許多delegateurl
方法,當遇到大文檔或者複雜的工做流時,這些方法都很是的方便。spa
源文件:操作系統