ios UIDocumentInterationController基本使用

IMG_0001.JPG

文章主要写来日后自己回顾,不详细

1、在项目的info.plist里面添加相应的键值对,将事先下载好的pdf拖到项目中,如图1.0和1.1,注意不是TARGETS下的info里面添加,在那里面添加会导致程序crash

1.0 下载的pdf拖到项目中
图1.1 添加所需键值对

2、进入程序,遵循代理<UIDocumentInteractionControllerDelegate>

设置全局变量或者属性

    UIDocumentInteractionController *documentIntertactionController;
}

3、创建两个button,一个用来打开其他app,一个用来预览文件,如图3.1

图3.1

4、打开的方法实现

// 打开
- (void)openUIDocument{
    NSURL *pathUrl = [[NSBundle mainBundle] URLForResource:@"Steve" withExtension:@".pdf"];   
    documentIntertactionController = [UIDocumentInteractionController interactionControllerWithURL:pathUrl];    
    documentIntertactionController.delegate = self;    
    [self presentOptionsMenu];
}


- (void)presentOptionsMenu{
    [documentIntertactionController presentOptionsMenuFromRect:self.view.bounds inView:self.view animated:YES];
}

以下是上面方法的官方解释

application to pass to receiver (must be a plist object). default is nil.

// This is the default method you should call to give your users the option to quick look, open, or copy the document.
// Presents a menu allowing the user to Quick Look, open, or copy the item specified by URL.
// This automatically determines the correct application or applications that can open the item at URL.
// Returns NO if the options menu contained no options and was not opened.
// Note that you must implement the delegate method documentInteractionControllerViewControllerForPreview: to get the Quick Look menu item.

5、点击打开,如图5.1,这是模拟器的效果,在手机上还有其他软件,比如微信qq等等

图5.1

6、预览对应的代码

// 预览
- (void)previewUIDocument{
    NSURL *pathUrl = [[NSBundle mainBundle] URLForResource:@"Steve" withExtension:@".pdf"];
    documentIntertactionController = [UIDocumentInteractionController interactionControllerWithURL:pathUrl];
    documentIntertactionController.delegate = self;
    [self presentUIDocument];
}

- (void)presentUIDocument{
    [documentIntertactionController presentPreviewAnimated:YES];
}
// 预览的时候需要加上系统的代理方法
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
    return self;
}

7、点击预览,如图7.1

图7.1 预览

8、以上为加载本地存在的文件,下面介绍根据网址打开和预览

9、open网上链接,代码如下

- (void)openUIDocument{
    [self openDocument];
}

- (void)openDocument{
    [self pathUrl];  // 该方法在最下面
    
    NSData *data = [NSData dataWithContentsOfURL:_pathUrl];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString  *documentsDirectory = [paths objectAtIndex:0];
    NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"Python核心编程.pdf"];
    BOOL isWriteSuccess = [data writeToFile:filePath atomically:YES];
    
    if(isWriteSuccess) {//success
   
        NSURL *url = [NSURL fileURLWithPath:filePath];
        [self previewPdfWithUrl:url];
        [self presentOptionsMenu];
    }
    else{
        NSLog(@"file not written");
    }
}
- (void)previewPdfWithUrl:(NSURL*)url{
    documentIntertactionController = [UIDocumentInteractionController interactionControllerWithURL:url];
    documentIntertactionController.delegate = self;
}

- (void)presentOptionsMenu{
    [documentIntertactionController presentOptionsMenuFromRect:self.view.bounds inView:self.view animated:YES];
}

效果如图5.1

10、 预览,代码如下

- (void)previewUIDocument{
    [self previewDocument];
    
}

- (void)previewDocument{

    [self pathUrl];

    NSData *data = [NSData dataWithContentsOfURL:_pathUrl];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString  *documentsDirectory = [paths objectAtIndex:0];
    NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"Python核心编程.pdf"];

    BOOL isWriteSuccess = [data writeToFile:filePath atomically:YES];
    
    if(isWriteSuccess) {//success
        NSLog(@"%@",filePath);
        NSURL *url = [NSURL fileURLWithPath:filePath];
        [self previewPdfWithUrl:url];
        [self presentUIDocument];
    }
    else{
        NSLog(@"file not written");
    }
    
}
- (void)previewPdfWithUrl:(NSURL*)url{
    documentIntertactionController = [UIDocumentInteractionController interactionControllerWithURL:url];
    documentIntertactionController.delegate = self;
}

- (NSURL *)pathUrl{
    if (_pathUrl== nil) {
        NSString *urlString = @"http://platform-test.lejuwanjia.com/api/v1/web/content/sale.order.picture/158/picture/Python核心编程.pdf";
        NSString *urlStr = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//        _pathUrl = [NSURL URLWithString:urlStr];
        _pathUrl = [NSURL URLWithString:urlStr];
        NSLog(@"pathUrl:%@",_pathUrl);
    }
    return _pathUrl;
}

- (void)presentUIDocument{
    [documentIntertactionController presentPreviewAnimated:YES];
}
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
    return self;
}


#pragma mark - url 中文格式化
+ (NSString *)strUTF8Encoding:(NSString *)str
{
    /*! ios9适配的话 打开第一个 */
    if ([[UIDevice currentDevice] systemVersion].floatValue >= 9.0)
    {
         return [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]];
    }
    else
    {
        return [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    }
}

11 网上文件的预览需要先缓存到本地,这时候可以建一个缓存目录,以便于以后删除缓存

11.1 如果是请求网络然后返回了一个NSData对象,这时候可以先保存到某个目录下面,下一个预览的时候判断此目录下是否有文件来减少网络请求
- (void)previewWithModel:(OSPAttachFileModel *)model {
// 此model为点击某行cell时对应的model
        NSString *filePath = [self getFilePathWithModel:model];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        BOOL isDir = NO;
        BOOL existed = [fileManager fileExistsAtPath:filePath isDirectory:&isDir];
        if (existed) {
            NSURL *url = [NSURL fileURLWithPath:filePath];
            [self previewPdfWithUrl:url];
        }else {
            [OSPToast show];
            [[OSPServiceCallsService sharedInstance] queryDocumentWithDocumentId:model.documentId equipmentId:model.equipmentId completion:^(NSData *data,NSHTTPURLResponse * response, NSError * error) {
                [OSPToast dismiss];
                if (data.length) {
                    [self previewDocumentWithFilePath:filePath data:data];
                }
            }];
        }
}

- (NSString *)getFilePathWithModel:(OSPAttachFileModel *)model {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString  *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *dataFilePath = [documentsDirectory stringByAppendingPathComponent:OSPAttchFile];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDir = NO;
    BOOL existed = [fileManager fileExistsAtPath:dataFilePath isDirectory:&isDir];
    if (!(isDir && existed)) {
        [fileManager createDirectoryAtPath:dataFilePath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    NSString *documentIdStr = [NSString stringWithFormat:@"%zd", model.documentId];
    NSString *filePath = [NSString stringWithFormat:@"%@/%@-%@", dataFilePath,documentIdStr,model.documentName];
    return filePath;
}

- (void)previewPdfWithUrl:(NSURL*)url {
    _documentInteraction = [UIDocumentInteractionController interactionControllerWithURL:url];
    _documentInteraction.delegate = self;
    [_documentInteraction presentPreviewAnimated:YES];
}

- (void)previewDocumentWithFilePath:(NSString *)filePath data:(NSData *)data {
    BOOL isWriteSuccess = [data writeToFile:filePath atomically:YES];
    if(isWriteSuccess) {//success
        NSURL *url = [NSURL fileURLWithPath:filePath];
        [self previewPdfWithUrl:url];
    }else {
        DLog(@"file not written");
    }
}

11.1preview.png

点击其中一个文件,先根据model中的文件名以及id找到对应路径下是否存在文件,如果存在直接preview,不存在的话根据model生成的路径及文件名将下载的NSData write to file ,成功之后preview


对应文件路径及文件名.png
gotofolder.png

根据model生成的文件,OSPAttachFile为创建的文件夹,易于管理


Snip20190221_9.png

根据文件filepath,直接preview


Snip20190221_11.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容