iOS打开本地和网络上的word、ppt、excel等文件
2016-01-06 19:24
591 查看
#iOS打开本地和网络上的word、ppt、excel、text等文件#
iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word、ppt、excel等文件格式。那么系统提供两个类去预览这些文件,这两个类分别为QLPreviewController和UIDocumentInteractionController。
一、先看QLPreviewController怎么用。
我们要用QLPreviewController,首先要 import < QuickLook/QuickLook.h >,然后创建一个QuickLookViewController继承UIViewController,并且要遵守QuickLookViewController的代理方法 < QLPreviewControllerDataSource,
QLPreviewControllerDelegate >,这个和tableView的用法很相似。下面看代码:
.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怎么用。
我们还是要建立一个DocumentInteractionViewController,继承UIViewController,并且遵守代理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];
}
(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];
}
}
(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];
}
- (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];
//
}
else {
NSURL *targetURL = [NSURL URLWithString:self.fileURLString];
}
(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
原创博客,不得转载,谢谢。
iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word、ppt、excel等文件格式。那么系统提供两个类去预览这些文件,这两个类分别为QLPreviewController和UIDocumentInteractionController。
一、先看QLPreviewController怎么用。
我们要用QLPreviewController,首先要 import < QuickLook/QuickLook.h >,然后创建一个QuickLookViewController继承UIViewController,并且要遵守QuickLookViewController的代理方法 < QLPreviewControllerDataSource,
QLPreviewControllerDelegate >,这个和tableView的用法很相似。下面看代码:
.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怎么用。
我们还是要建立一个DocumentInteractionViewController,继承UIViewController,并且遵守代理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
原创博客,不得转载,谢谢。
相关文章推荐
- JSON,ListView AsyncHttpClient 等第三方包的综合实应用
- 卷积神经网络CNN在自然语言处理的应用
- 算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
- 前篇:3.团队初建,与设计师建立设计规范。http://www.ui.cn/detail/67329.html
- Linux学习之Center os网络配置
- NSIS DirectUI界面 nsSkinEngine 插件,让安装包不再枯燥,一键打包!!http://www.aceui.cn/
- 基于神经网络和遗传算法的【手写数字识别】机器人的实现
- 网络接口获取下来的时间转换成NSDate
- 互联网协议 网络通信
- HTTP协议
- 监测网络状态
- Android-Volley网络通信框架
- HTTP协议
- 运输层TCP协议详细介绍
- 使用shiro的session后,HttpSession.getServletContext() 获取一直是null的解决方法
- 网络编程基础
- HTTP 错误 500.19 - Internal Server Error
- [转]其实你不懂wget的心 http://www.cnblogs.com/cbscan/articles/2276817.html
- redhat5在VM下无法连接网络--host-only类型
- 配置基于http的yum源