第五十六篇、OC打开本地和网络上的word、ppt、excel、text等文件

iOS打开本地和网络上的word、ppt、excel、text等文件

 iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word、ppt、excel等文件格式。那么系统提供两个类去预览这些文件,这两个类分别为QLPreviewController和UIDocumentInteractionController。

一、先看QLPreviewController怎么用

  1.导入头文件  import < QuickLook/QuickLook.h >

  2.创建一个继承QuickLookViewController继承UIViewController

  3.遵守协议< QLPreviewControllerDataSource, QLPreviewControllerDelegate >

.h文件中的代码 
# import < UIKit/UIKit.h > 
# import < QuickLook/QuickLook.h >

@interface QuickLookViewController : UIViewController < QLPreviewControllerDataSource, 
QLPreviewControllerDelegate > 
@property (nonatomic,strong) QLPreviewController *previewController; 
@property (nonatomic,retain)NSURL *fileURL;

@end

 

.m文件中的代码: 
# import “QuickLookViewController.h”

@interface QuickLookViewController ()

@end

@implementation QuickLookViewController 
@synthesize previewController = _previewController;

(void)viewDidLoad { 
[super viewDidLoad]; 
self.view.backgroundColor = [UIColor whiteColor]; 
self.title = @”附件预览”; 
_previewController = [[QLPreviewController alloc] init]; 
_previewController.dataSource = self; 
_previewController.delegate = self;

_previewController.view.frame = CGRectMake(0, 64, self.view.frame.size.width , self.view.frame.size.height); 
_previewController.currentPreviewItemIndex = 0; 
// [self addChildViewController:_previewController]; 
[self.view addSubview:_previewController.view]; 
[_previewController reloadData];

} 
- (id ) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger) index{ 
return self.fileURL; 
} 
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller{ 
return 1; 
} 
@end

这样我们就完成了这个QuickLookViewController,使用:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@”Reader” ofType:@”pdf”]; 
NSURL *URL = [NSURL fileURLWithPath:filePath]; 
QuickLookViewController *quickLookVC = [[QuickLookViewController alloc]init]; 
quickLookVC.fileURL = URL;//本地图片的url 
[self.navigationController pushViewController:quickLookVC animated:YES];

 

二、再看UIDocumentInteractionController 
  1.建立一个DocumentInteractionViewController,继承UIViewController

  2.遵守代理UIDocumentInteractionControllerDelegate。 

.h里面的代码 
# import < UIKit/UIKit.h >

@interface DocumentInteractionViewController : UIViewController< UIDocumentInteractionControllerDelegate,UIAlertViewDelegate > 
@property(nonatomic,strong) UIDocumentInteractionController *documentInteractionController; 
- (void)openFileWithURL:(NSURL *)URL; 
@end 

 

.m里面的代码 
# import “DocumentInteractionViewController.h”

@interface DocumentInteractionViewController () 
{ 
NSURL *_fileURL; 
BOOL _isPreview; 
BOOL _isOpenInMenu; 
} 
@end

@implementation DocumentInteractionViewController

(void)viewDidLoad { 
[super viewDidLoad]; 
self.view.backgroundColor = [UIColor whiteColor];

self.navigationController.navigationBarHidden = YES;

} 
- (void)openFileWithURL:(NSURL *)URL 
{ 
NSLog(@”now open %@”,URL); 
if (URL) { 
_fileURL = URL; 
_isPreview = NO; 
_isOpenInMenu = NO; 
// Initialize Document Interaction Controller 
self.documentInteractionController = [UIDocumentInteractionController 
interactionControllerWithURL:URL]; 
// Configure Document Interaction Controller 
self.documentInteractionController.delegate = self; 
// Preview File 
[self.documentInteractionController presentPreviewAnimated:YES];

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkPreview) userInfo:nil repeats:NO];
}
}

(void)checkPreview 
{ 
if(_isPreview == NO) 
{ 
if (_fileURL) { 
// Initialize Document Interaction Controller 
self.documentInteractionController = [UIDocumentInteractionController 
interactionControllerWithURL:_fileURL]; 
// Configure Document Interaction Controller 
self.documentInteractionController.delegate = self; 
// Present Open In Menu 
[self.documentInteractionController presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkOpenInMenu) userInfo:nil repeats:NO];
}
} 
}

(void)checkOpenInMenu{ 
if(_isOpenInMenu == NO) 
{ 
[self showWarning]; 
[[UIApplication sharedApplication]openURL:_fileURL]; 
} 
}

(void)showWarning{ 
NSString *fileType = [[_fileURL.absoluteString componentsSeparatedByString:@”.”]lastObject];

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@”出错提示” message:[NSString stringWithFormat:@”不支持%@格式,请下载相关播放器打开”,fileType] delegate:self cancelButtonTitle:@”确定” otherButtonTitles:nil]; 
[alert show];

}

(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
[self.navigationController popViewControllerAnimated:YES]; 
}
(UIViewController )documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController )controller{ 
return self; 
}
// Preview presented/dismissed on document. Use to set up any HI underneath. 
- (void)documentInteractionControllerWillBeginPreview:(UIDocumentInteractionController *)controller{ 
controller.name = @”附件预览”; 
NSLog(@”willBeginPreview”); 
_isPreview = YES; 
}

(void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller{ 
NSLog(@”didEndPreview”); 
[self.navigationController popViewControllerAnimated:YES]; 
}
// Options menu presented/dismissed on document. Use to set up any HI underneath. 
- (void)documentInteractionControllerWillPresentOptionsMenu:(UIDocumentInteractionController *)controller{ 
NSLog(@”willPresentOptionsMenu”); 
}

(void)documentInteractionControllerDidDismissOptionsMenu:(UIDocumentInteractionController *)controller{ 
NSLog(@”didDismissOptionsMenu”); 
}
// Open in menu presented/dismissed on document. Use to set up any HI underneath. 
- (void)documentInteractionControllerWillPresentOpenInMenu:(UIDocumentInteractionController *)controller{ 
NSLog(@”willPresentOpenInMenu”); 
_isOpenInMenu = YES; 
} 
- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller{ 
NSLog(@”didDismissOpenInMenu”); 
[self.navigationController popViewControllerAnimated:YES]; 
} 
@end

这样我们就完成了这个DocumentInteractionViewController,再来看用的时候怎么写: 
NSString *filePath = [[NSBundle mainBundle] pathForResource:@”Reader” ofType:@”pdf”]; 
NSURL *URL = [NSURL fileURLWithPath:filePath];

DocumentInteractionViewController *documentVC = [[DocumentInteractionViewController alloc]init]; 
[documentVC openFileWithURL:URL]; //本地文件的URL 
[self.navigationController pushViewController:documentVC animated:YES];

 

上面讲的都是打开的本地的文件,那么我如果要预览一个网页上的资源呢?类似这样的URL http://weixintest.ihk.cn/ihkwx_upload/1.pdf ,怎么办? 
理论是这样的,第一次预览,我们要下载到本地,然后打开这个资源,那么第n(n>1)次打开就从本地找到下载的这个资源直接打开就可以了。 
那么我们要在我们的vc里面写一个UIWebView了。比如我们的vc就是OpenRemoteFileViewController,那么来看具体的代码实现 

.h文件里面的代码 
# import < UIKit/UIKit.h> 
#import < QuickLook/QuickLook.h>

@interface OpenRemoteFileViewController : UIViewController 
@property (nonatomic, retain)NSString *fileURLString; 
@end

 

.m文件里面的代码

#import “OpenRemoteFileViewController.h” 
@interface OpenRemoteFileViewController () < UIWebViewDelegate,QLPreviewControllerDataSource,QLPreviewControllerDelegate >{ 
UIWebView *openFileWebView;

} 
@property (nonatomic,strong)NSURL *fileURL;

@end

@implementation OpenRemoteFileViewController 
-(void)openPDF:(UIButton *)sender{ 
openFileWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height)]; 
openFileWebView.delegate = self; 
[openFileWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.fileURLString]]]; 
} 
- (void)viewDidLoad { 
[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];
UIButton *centerBtn = [UIButton buttonWithType:UIButtonTypeCustom];
centerBtn.backgroundColor = [UIColor orangeColor];
centerBtn.frame = CGRectMake(0, 0, 200, 50);
centerBtn.center = self.view.center;
[centerBtn addTarget:self action:@selector(openPDF:) forControlEvents:UIControlEventTouchUpInside];
[centerBtn setTitle:@"打开一个远程PDF" forState:UIControlStateNormal];
[self.view addSubview:centerBtn];
} 
- (BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType 
{ 
return YES; 
} 
#pragma mark - Web代理 
- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
NSURL *targetURL = [NSURL URLWithString:self.fileURLString];

NSString *docPath = [self documentsDirectoryPath];
NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docPath, [targetURL lastPathComponent]];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL hasDownLoad= [fileManager fileExistsAtPath:pathToDownloadTo];
if (hasDownLoad) {
    self.fileURL = [NSURL fileURLWithPath:pathToDownloadTo];
    QLPreviewController *qlVC = [[QLPreviewController alloc]init];
    qlVC.delegate = self;
    qlVC.dataSource = self;
    [self.navigationController pushViewController:qlVC animated:YES];
// 
} 
else { 
NSURL *targetURL = [NSURL URLWithString:self.fileURLString];

    NSData *fileData = [[NSData alloc] initWithContentsOfURL:targetURL];
    // Get the path to the App's Documents directory
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
    [fileData writeToFile:[NSString stringWithFormat:@"%@/%@", documentsDirectory, [targetURL lastPathComponent]] atomically:YES];
    NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
    [openFileWebView loadRequest:request];
}

NSLog(@"webViewDidFinishLoad");
}

(void)webView:(UIWebView )webView didFailLoadWithError:(NSError )error 
{ 
NSLog(@”didFailLoadWithError”); 
}

(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller { 
return 1; 
}

(id )previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index { 
return self.fileURL; 
}

(void)previewControllerWillDismiss:(QLPreviewController *)controller { 
NSLog(@”previewControllerWillDismiss”); 
}

(void)previewControllerDidDismiss:(QLPreviewController *)controller { 
NSLog(@”previewControllerDidDismiss”); 
}

(BOOL)previewController:(QLPreviewController )controller shouldOpenURL:(NSURL )url forPreviewItem:(id )item{ 
return YES; 
}

(CGRect)previewController:(QLPreviewController )controller frameForPreviewItem:(id )item inSourceView:(UIView __nullable * __nonnull)view{ 
return CGRectZero; 
}

(NSString *)documentsDirectoryPath { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 
return documentsDirectoryPath; 
} 
@end

 

 

使用:

OpenRemoteFileViewController *openRemoteFileVC =[[OpenRemoteFileViewController alloc]init]; 
openRemoteFileVC.fileURLString = @”http://weixintest.ihk.cn/ihkwx_upload/1.pdf“;//网络资源URL 
[self.navigationController pushViewController:openRemoteFileVC animated:YES]; 

 

文章最后提供demo地址:https://github.com/zhengwenming/OpenFile

posted on 2016-10-15 10:45  久冬不雨  阅读(613)  评论(0编辑  收藏  举报