• 第五十六篇、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

  • 相关阅读:
    vuecli 4使用report分析vendor.js
    vue使用 NProgress 浏览器顶部进度条
    vue项目中 configureWebpack 与 chainWebpack的区别及配置方式
    vue 项目中报错 Error: Avoided redundant navigation to current location: “/xxx”. 的解决方案
    npm中的savedev和save的区别
    vuecli 4 使用scss (配置全局scss变量)
    css如何修改滚动条样式
    vue 项目http://localhost:8080/sockjsnode/info?t=1556418283950 net:: ERR_CONNECTION_REFUSED
    java类的加载时机
    android中屏蔽键盘的2种方法
  • 原文地址:https://www.cnblogs.com/HJQ2016/p/5962913.html
Copyright © 2020-2023  润新知