宽容他人,放过自己。

iOS开发- 文件共享(利用iTunes导入文件, 并且显示已有文件)

Posted on By anchoriteFili

相关链接


创建过程


1. 首先在plist文件中进行设置,加入 UIFileSharingEnabled 使项目能够实现ituns共享功能

752372-20160902113843871-339875070.png

2. 引入QuickLook框架 #import <QuickLook/QuickLook.h>

其中引入头#improt <string.h>为的使用 strlen(txt) 来计算char长度

3. 创建tableView,用来承载从共享文件夹中获取的文件列表名

4. 导入各种代理方法

<UITableViewDelegate,UITableViewDataSource,QLPreviewControllerDelegate,QLPreviewControllerDataSource,UIDocumentInteractionControllerDelegate>

5. 书写沙盒文件相关的处理方法

#pragma mark **************** 沙盒中文件相关处理 begin ****************
#pragma mark 保存图片的本地方法
- (void)saveToDocumentsWithImage:(UIImage *)image andImageName:(NSString *)imageName {
    NSData *imageData = UIImageJPEGRepresentation(image, 0.8); // 转换类型
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSString *filePath = [documentPath stringByAppendingPathComponent:imageName];
    [imageData writeToFile:filePath atomically:YES]; // 将数据写书沙盒
}

#pragma mark 保存文字相关内容
- (void)saveToDocumentsWithTxT:(char *)txt andTxtFileName:(NSString *)txtFileName {

    NSData *txtData = [[NSData alloc] initWithBytes:txt length:strlen(txt)];
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSString *filePath = [documentPath stringByAppendingPathComponent:txtFileName];
    [txtData writeToFile:filePath atomically:YES];
}

#pragma mark 直接获取ituns文件夹中列表
- (NSArray *)getFileListFromDocument {
    
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSError *error = nil;
    NSArray *fileList = [NSArray array];
    
    fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentPath error:&error]; // 获取内容

    return fileList;
}

#pragma mark 获取沙盒中文件路径url
- (NSURL *)getFileUrlOfDocumentsWithIndex:(NSInteger)index {
    
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSArray *fileList = [self getFileListFromDocument];
    NSString *path = [documentPath stringByAppendingPathComponent:[fileList objectAtIndex:index]];
    return [NSURL fileURLWithPath:path];
}
#pragma mark **************** 沙盒中文件相关处理 end ****************

6. 根据方法获取进行相关数据的添加

1> 获取列表信息
self.dirArray = [self getFileListFromDocument]; // 获取沙盒文件列表名字
[self.readTableView reloadData];
2> 在cellForRow里边设置各种数据,即可显示列表
#pragma mark cellForRow方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    
    cell.textLabel.text = [self.dirArray objectAtIndex:indexPath.row];
    
    NSURL *fileURL = [self getFileUrlOfDocumentsWithIndex:indexPath.row];
    // 根据fileURL创建DocumentController
    [self setupDocumentControllerWithURL:fileURL];
    // 获取页面中的icons
    NSInteger iconCount = [self.documentInteractionController.icons count];
    if (iconCount > 0) {
        // 将icon作为cell上的图片
        cell.imageView.image = [self.documentInteractionController.icons objectAtIndex:iconCount-1];
    }
    
    //    设置选择时的状态
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    //    设置cell背景色为透明色
    cell.backgroundColor = [UIColor clearColor];
    
    return cell;
}
7. 创建QLPreviewController部分东西
#pragma mark 添加点击cell的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    QLPreviewController *previewController = [[QLPreviewController alloc] init];
    previewController.dataSource = self;
    previewController.delegate = self;
    
    previewController.currentPreviewItemIndex = indexPath.row;
    [self.navigationController pushViewController:previewController animated:YES];
    
    //点击以后直接恢复正常状态
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark **************** previewController方法/代理方法部分 begin ****************
- (void)setupDocumentControllerWithURL:(NSURL *)url {
    if (self.documentInteractionController == nil) {
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:url];
        self.documentInteractionController.delegate = self;
    } else {
        self.documentInteractionController.URL = url;
    }
}

#pragma mark 设置previewController中item的个数
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
    return 1;
}

#pragma mark 从previewController页面返回时的代理方法
- (void)previewControllerDidDismiss:(QLPreviewController *)controller {
    // 可以处理返回的数据
}

#pragma mark 点击previewItem是点击获取内容相关信息
- (id)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
    NSIndexPath *selectIndexPath = [self.readTableView indexPathForSelectedRow];
    NSURL *fileURL = [self getFileUrlOfDocumentsWithIndex:selectIndexPath.row];
    return fileURL;
}

#pragma mark **************** previewController方法/代理方法部分 end ****************

全部代码


//
//  ViewController.m
//  ituns共享文件练习
//
//  Created by 赵宏亚 on 16/8/31.
//  Copyright © 2016年 赵宏亚. All rights reserved.
//

#import "ViewController.h"
#import <string.h>
#import <QuickLook/QuickLook.h>

@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,QLPreviewControllerDelegate,QLPreviewControllerDataSource,UIDocumentInteractionControllerDelegate>

@property (weak, nonatomic) IBOutlet UITableView *readTableView; //用于显示共享文件夹中文件
@property (nonatomic,strong) UIDocumentInteractionController *documentInteractionController; // 系统沙盒文件交互VC
@property (nonatomic,strong) NSArray *dirArray; //存储路径名称


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    self.dirArray = [self getFileListFromDocument]; // 获取沙盒文件列表名字
    NSLog(@"self.dirArray ===== %@",self.dirArray);
    
    self.readTableView.delegate = self;
    self.readTableView.dataSource = self;
    //    设置tableView背景色为透明色
    self.readTableView.backgroundColor = [UIColor clearColor];
    //    分割线样式
    //     self.tabelView.separatorStyle = UITableViewCellSeparatorStyleNone;
    //去掉空白cell
    self.readTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
    
    [self.readTableView reloadData];
}


#pragma mark **************** tableView代理 begin ****************
#pragma mark 设置每行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 60;
}

#pragma mark 设置section的个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

#pragma mark 设置每个section的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
    return self.dirArray.count;
}

#pragma mark cellForRow方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    
    cell.textLabel.text = [self.dirArray objectAtIndex:indexPath.row];
    
    NSURL *fileURL = [self getFileUrlOfDocumentsWithIndex:indexPath.row];
    // 根据fileURL创建DocumentController
    [self setupDocumentControllerWithURL:fileURL];
    // 获取页面中的icons
    NSInteger iconCount = [self.documentInteractionController.icons count];
    if (iconCount > 0) {
        // 将icon作为cell上的图片
        cell.imageView.image = [self.documentInteractionController.icons objectAtIndex:iconCount-1];
    }
    
    //    设置选择时的状态
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    //    设置cell背景色为透明色
    cell.backgroundColor = [UIColor clearColor];
    
    return cell;
}

#pragma mark 添加点击cell的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
    QLPreviewController *previewController = [[QLPreviewController alloc] init];
    previewController.dataSource = self;
    previewController.delegate = self;
    
    previewController.currentPreviewItemIndex = indexPath.row;
    [self.navigationController pushViewController:previewController animated:YES];
    
    //点击以后直接恢复正常状态
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

#pragma mark **************** tableView代理 end ****************

#pragma mark **************** previewController方法/代理方法部分 begin ****************
- (void)setupDocumentControllerWithURL:(NSURL *)url {
    if (self.documentInteractionController == nil) {
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:url];
        self.documentInteractionController.delegate = self;
    } else {
        self.documentInteractionController.URL = url;
    }
}

#pragma mark 设置previewController中item的个数
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
    return 1;
}

#pragma mark 从previewController页面返回时的代理方法
- (void)previewControllerDidDismiss:(QLPreviewController *)controller {
    // 可以处理返回的数据
}

#pragma mark 点击previewItem是点击获取内容相关信息
- (id)previewController:(QLPreviewController *)controller previewItemAtIndex:(NSInteger)index {
    NSIndexPath *selectIndexPath = [self.readTableView indexPathForSelectedRow];
    NSURL *fileURL = [self getFileUrlOfDocumentsWithIndex:selectIndexPath.row];
    return fileURL;
}

#pragma mark **************** previewController方法/代理方法部分 end ****************

#pragma mark **************** 沙盒中文件相关处理 begin ****************
#pragma mark 保存图片的本地方法
- (void)saveToDocumentsWithImage:(UIImage *)image andImageName:(NSString *)imageName {
    NSData *imageData = UIImageJPEGRepresentation(image, 0.8); // 转换类型
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSString *filePath = [documentPath stringByAppendingPathComponent:imageName];
    [imageData writeToFile:filePath atomically:YES]; // 将数据写书沙盒
}

#pragma mark 保存文字相关内容
- (void)saveToDocumentsWithTxT:(char *)txt andTxtFileName:(NSString *)txtFileName {

    NSData *txtData = [[NSData alloc] initWithBytes:txt length:strlen(txt)];
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSString *filePath = [documentPath stringByAppendingPathComponent:txtFileName];
    [txtData writeToFile:filePath atomically:YES];
}

#pragma mark 直接获取ituns文件夹中列表
- (NSArray *)getFileListFromDocument {
    
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSError *error = nil;
    NSArray *fileList = [NSArray array];
    
    fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentPath error:&error]; // 获取内容

    return fileList;
}

#pragma mark 获取沙盒中文件路径url
- (NSURL *)getFileUrlOfDocumentsWithIndex:(NSInteger)index {
    
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 获取沙盒路径
    NSArray *fileList = [self getFileListFromDocument];
    NSString *path = [documentPath stringByAppendingPathComponent:[fileList objectAtIndex:index]];
    return [NSURL fileURLWithPath:path];
}
#pragma mark **************** 沙盒中文件相关处理 end ****************

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end