zoukankan      html  css  js  c++  java
  • 第五十六篇、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

  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/5962913.html
Copyright © 2011-2022 走看看