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

今天要实现一个功能, 通过iTunes导入文件到应用中, 并且在应用中对这个文件进行编辑。

类似我们平时经常使用的 PDF阅读器那样的东西, 我们可以自己导入我们的电子书。

源码下载:https://github.com/colin1994/iTunesTest.git

下面具体介绍下实现过程。

先看效果图。

图1. 未实现功能前, iTunes截图

图2. 实现功能后, iTunes截图

图3. 实现功能后, 运行截图。

好了, 通过图片, 我们可以看到实现的效果。

功能包括: 允许通过iTunes导入文件。 可以查看沙盒下所有文件。

实现过程:

1。在应用程序的Info.plist文件中添加UIFileSharingEnabled键,并将键值设置为YES。

2。具体代码:

ViewController.h

//
//  ViewController.h
//  iTunesTest
//
//  Created by Colin on 14-6-8.
//  Copyright (c) 2014年 icephone. All rights reserved.
//

#import <UIKit/UIKit.h>

//step1. 导入QuickLook库和头文件
#import <QuickLook/QuickLook.h>

//step2. 继承协议
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,QLPreviewControllerDataSource,QLPreviewControllerDelegate,UIDocumentInteractionControllerDelegate>
{
    //step3. 声明显示列表
    IBOutlet UITableView *readTable;
}

//setp4. 声明变量
//UIDocumentInteractionController : 一个文件交互控制器,提供应用程序管理与本地系统中的文件的用户交互的支持
//dirArray : 存储沙盒子里面的所有文件
@property(nonatomic,retain) NSMutableArray *dirArray;
@property (nonatomic, strong) UIDocumentInteractionController *docInteractionController;
@end

ViewController.m

//
//  ViewController.m
//  iTunesTest
//
//  Created by Colin on 14-6-8.
//  Copyright (c) 2014年 icephone. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize dirArray;
@synthesize docInteractionController;

- (void)viewDidLoad
{
    [super viewDidLoad];

    //step5. 保存一张图片到设备document文件夹中(为了测试方便)
    UIImage *image = [UIImage imageNamed:@"testPic.jpg"];
    NSData *jpgData = UIImageJPEGRepresentation(image, 0.8);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"testPic.jpg"]; //Add the file name
    [jpgData writeToFile:filePath atomically:YES]; //Write the file

    //step5. 保存一份txt文件到设备document文件夹中(为了测试方便)
    char *saves = "Colin_csdn";
    NSData *data = [[NSData alloc] initWithBytes:saves length:10];
    filePath = [documentsPath stringByAppendingPathComponent:@"colin.txt"];
    [data writeToFile:filePath atomically:YES];

    //step6. 获取沙盒里所有文件
	NSFileManager *fileManager = [NSFileManager defaultManager];
	//在这里获取应用程序Documents文件夹里的文件及文件夹列表
	NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentDir = [documentPaths objectAtIndex:0];
	NSError *error = nil;
	NSArray *fileList = [[NSArray alloc] init];
	//fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组
	fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];

	self.dirArray = [[NSMutableArray alloc] init];
	for (NSString *file in fileList)
	{
		[self.dirArray addObject:file];
	}

	//step6. 刷新列表, 显示数据
	[readTable reloadData];
}

//step7. 利用url路径打开UIDocumentInteractionController
- (void)setupDocumentControllerWithURL:(NSURL *)url
{
    if (self.docInteractionController == nil)
    {
        self.docInteractionController = [UIDocumentInteractionController interactionControllerWithURL:url];
        self.docInteractionController.delegate = self;
    }
    else
    {
        self.docInteractionController.URL = url;
    }
}

#pragma mark- 列表操作
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
	return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	static NSString *CellName = @"CellName";
	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellName];
	if (cell == nil)
	{
		cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellName];
		cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
	}

	NSURL *fileURL= nil;
	NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentDir = [documentPaths objectAtIndex:0];
	NSString *path = [documentDir stringByAppendingPathComponent:[self.dirArray objectAtIndex:indexPath.row]];
	fileURL = [NSURL fileURLWithPath:path];

	[self setupDocumentControllerWithURL:fileURL];
	cell.textLabel.text = [self.dirArray objectAtIndex:indexPath.row];
	NSInteger iconCount = [self.docInteractionController.icons count];
    if (iconCount > 0)
    {
        cell.imageView.image = [self.docInteractionController.icons objectAtIndex:iconCount - 1];
    }

	return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
	return [self.dirArray count];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
	QLPreviewController *previewController = [[QLPreviewController alloc] init];
    previewController.dataSource = self;
    previewController.delegate = self;

    // start previewing the document at the current section index
    previewController.currentPreviewItemIndex = indexPath.row;
    [[self navigationController] pushViewController:previewController animated:YES];
    //	[self presentViewController:previewController animated:YES completion:nil];
}

#pragma mark - UIDocumentInteractionControllerDelegate

- (NSString *)applicationDocumentsDirectory
{
	return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)interactionController
{
    return self;
}

#pragma mark - QLPreviewControllerDataSource

// Returns the number of items that the preview controller should preview
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)previewController
{
	return 1;
}

- (void)previewControllerDidDismiss:(QLPreviewController *)controller
{
    // if the preview dismissed (done button touched), use this method to post-process previews
}

// returns the item that the preview controller should preview
- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx
{
    NSURL *fileURL = nil;
    NSIndexPath *selectedIndexPath = [readTable indexPathForSelectedRow];
	NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentDir = [documentPaths objectAtIndex:0];
	NSString *path = [documentDir stringByAppendingPathComponent:[self.dirArray objectAtIndex:selectedIndexPath.row]];
	fileURL = [NSURL fileURLWithPath:path];
    return fileURL;
}

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

@end

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

时间: 2024-12-19 15:43:41

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

iOS发展- 文件共享(使用iTunes导入文件, 并显示现有文件)

到今天实现功能, 由iTunes导入文件的应用程序, 并在此文档进行编辑的应用. 就像我们平时经常使用 PDF阅读这样的事情, 们能够自己导入我们的电子书. 源代码下载:https://github.com/colin1994/iTunesTest.git 以下详细介绍下实现过程. 先看效果图. 图1. 未实现功能前, iTunes截图 图2. 实现功能后, iTunes截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGl0d2h5bHo=/fo

iPhone 和 iPad的ios 开发中 利用 WebViewJavascriptBridge组件,通过 UIWebView 对Html进行双向通讯

本文转载至 http://blog.csdn.net/remote_roamer/article/details/7261490 WebViewJavascriptBridge 项目的 官网 https://github.com/marcuswestin/WebViewJavascriptBridge 主要过程: 下载WebViewJavascriptBridge.h 和 WebViewJavascriptBridge.m文件到自己的项目中,并添加到项目. 在相应的.h文件中 使用#import

李洪强iOS开发之-实现点击单行View显示和隐藏Cell

李洪强iOS开发之-实现点击单行View显示和隐藏Cell 实现的效果:  ....

IOS开发问题录:如何在Swift中引入Head文件?

最近在学习IOS开发,从一个简单的登录开始,逐步解决了一个网络访问.获取控件值等问题,遇到了信息加密的问题. 做为IOS的入门者,信息加密需要解决如下几个问题: 1.IOS的MD5加密有没有固定函数,怎么使用这个函数.. 经过查资料,在Object-C中有内置的函数 2.如何引入Object-C的函数 首先添加头文件,在xode 7 项目上右键 -new File->IOS->Source->HeadFile->下一步设置命名,可以任意命名,在head.h中加入如下代码: #imp

ios开发--一个苹果证书怎么多次使用——导出p12文件

为什么要导出.p12文件 当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了(一般在我们的证书界面中应该只有一个开发证书,一个发布证书,没必要生成那么多的证书,证书一般在过期之后才会重新添加.) 如图: 这时候,再点击“+”时,就会发现点击不了开发和发布证书,也就是添加不了开发证书和发布证书了: 有两个解决不能添加证书的办法. 第一种方法——“revoke”(不推荐): 将以前的证书“revoke

iOS开发中获取视图在屏幕上显示的位置

在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可是,如果按钮是在UITableView的cell上呢?随着UITableView的滚动,按钮可能在顶部,也可能在底部,还可能在中间,左侧.右侧都有可能,那么,这个时候,怎么去计算按钮所在的位置呢?如果按钮所在的UITabelView是在另外一个UIScrollView的一个cell上呢?如果外面再有

iOS开发——数据持久化Swift篇&amp;(二)沙盒文件

沙盒文件 1 //******************** 5.2 文件操作 2 func use_FileOperations() 3 { 4 //1.获取程序的Home目录 5 let homeDirectory = NSHomeDirectory() 6 println(homeDirectory) 7 8 9 //2.获取Documents目录 10 let documentPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathD

iOS 开发中利用 Quartz 2D 获得圆角图片

背景: 现在社交软件中,圆角的图片可以说是泛滥了,原来方方正正的 QQ 头像,都被世俗磨平了... 那么怎么将一张图片加工成圆角呢? 你可能会说:"找美工啊!" 对!偷懒必备口诀之 "找美工!" 但是,如果用户自己要上传自定义头像呢? 还是一要程序处理嘛! 下面我们利用强大的Quartz 2D 来自己加工图片 直接上代码: 代码: 我是给 UIImage 增加了一个分类,以后直接各种用 + (instancetype)imageWithIcon:(NSString

iOS开发之自定义SearchBar导航条右侧显示放大镜

ios中导航条SearchBar控件虽然说很好用,但是有的时候控件的样式不能达到我们的需要,比如我们需要导航条的右侧有个放大镜,系统提供的控件没有这样的,这就需要我们自定义一个这样的searchBar了. 1,因为searchBar控件输入的时候和textField想似,所以我们自定义的控件继承与textField,起名字为searchView 我们可以看一下searchView.h里面的内容 1 #import <UIKit/UIKit.h> 2 3 @interface searchVie