使用NSmetadataQuery查询文档,增加,删除,编辑

界面设计完成后效果如图:

程序清单:FKDiary.h

@interface FKDiary : UIDocument

@property (nonatomic,strong) NSData         *diaryData;
@property (nonatomic,copy) NSString *fileURL;
@end

程序清单FKDiary.m

#import "FKDiary.h"

@implementation FKDiary

//保存该对象时自动调用该方法
-(id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
NSLog(@"保存文件到URl %@!",self.fileURL);
if (self.diaryData == nil) {
return [[NSData alloc]init]; }
//将diaryData作为放回值,程序将会把该返回值保存到云端
return [self.diaryData copy];
}
//读取该对象时自动调用该方法
-(BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError
{
NSLog(@"从云端下载的数据为:%@",contents);
//将从云端下载得到的数据赋给diaryData数据
self.diaryData = [contents mutableCopy];
return true;
}

程序清单:FKMasterController.m

#import "FKDiary.h"

#import "ViewController.h"
@interface FKMasterController ()<UIAlertViewDelegate>
{
//定义导航栏左边的按钮
UIBarButtonItem *deleteButton;
}
@property (strong,nonatomic)NSMetadataQuery *query;
@property (strong,nonatomic)NSMutableArray *documentFilenames;
@property (strong,nonatomic)NSMutableArray *documentURLs;
@property (strong,nonatomic)FKDiary *chosenDiary; @end @implementation FKMasterController - (void)viewDidLoad {
[super viewDidLoad]; //创建导航栏邮编的按钮
UIBarButtonItem *addButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addDiary)];
//将导航栏按钮设置为导航栏的右边按钮
self.navigationItem.rightBarButtonItem = addButton;
//创建导航栏左边的按钮
deleteButton = [[UIBarButtonItem alloc]initWithTitle:@"删除" style:UIBarButtonItemStylePlain target:self action:@selector(deleteDiary)];
//创建导航栏左边的按niu
self.navigationItem.leftBarButtonItem = deleteButton;
//调用reloadFiles从云端下载文件
[self reloadFiles];
}
-(void)addDiary
{
//使用UIAlertView来获取文件名字
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"输入日记名" message:@"输入日记名称" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"创建", nil];
//设置该UIAlertView的风格为带输入框的UIAlertView
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
[alert show]; } -(NSURL *)urlForFilename:(NSString *)filename
{
//获取默认的NSFileManager对象
NSFileManager *fileManager = [NSFileManager defaultManager];
//根据Identifier获取系统的Ubiquity Container
//如果传入nil参数,则默认获取第一个Ubiquity Container
NSURL *baseURL = [fileManager URLForUbiquityContainerIdentifier:nil];
//获取云端Ubiquity Container的Documents子目录
NSURL *pathURL = [baseURL URLByAppendingPathComponent:@"Documents"];
//在Documents子目录下添加文件名,作为保存文件的URL
NSURL *destinationURL = [pathURL URLByAppendingPathComponent:filename];
return destinationURL;
} -(void)reloadFiles
{
//创建一个NSMetataQuery对象
self.query = [[NSMetadataQuery alloc]init];
//设置查询谓词
self.query.predicate = [NSPredicate predicateWithFormat:@"%K like '*.diary'",NSMetadataItemFSNameKey];
//设置查询范围,此处指定查询范围为NSMetadataQueryUbiquitousDocumentsScope
// 即在云端的Documents目录下查询
self.query.searchScopes = [NSArray arrayWithObject:NSMetadataQueryUbiquitousDataScope];
//获取数据结束时激发updateUbiquitousDocuments方法
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateUbiquitousDocuments:) name:NSMetadataQueryDidFinishGatheringNotification object:nil];
//查询更新完成时激发updateUbiquitousDocuments方法
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateUbiquitousDocuments:) name:NSMetadataQueryDidUpdateNotification object:nil]; //开始查询
[self.query startQuery];
} -(void)updateUbiquitousDocuments:(NSNotification *)notification
{
self.documentURLs = [NSMutableArray array];
self.documentFilenames = [NSMutableArray array];
//对查询结果进行排序,排序所使用的比较标准是创建时间
NSArray *results = [self.query.results sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSMetadataItem *item1 = obj1;
NSMetadataItem *item2 = obj2;
//比较两个NSMetadataItem的时间
return [[item2 valueForAttribute:NSMetadataItemFSCreationDateKey] compare:[item1 valueForAttribute:NSMetadataItemFSCreationDateKey]];
}];
//遍历查询结果
for (NSMetadataItem *item in results) {
//查询结果中包含的NSURL属性
NSURL *url = [item valueForAttribute: NSMetadataItemURLKey];
//将NSURL添加到documentURLs集合中
[self.documentURLs addObject:url];
//将NSURL的最后一个路径(文件名)添加到documentfilenames集合中
[self.documentFilenames addObject:url]; }
//控制界面上表哥重新加载数据
[self.tableView reloadData]; }
-(void)perpareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//如果sender等于self,则表明是新建FKDiary后导航到查看,编辑日记的视图空孩子气
if (sender == self) {
UIViewController *destination = segue.destinationViewController;
//将用户新建的FKDiary对象传给目标视图控制器
if ([destination respondsToSelector:@selector(setDetailItem:)])
{
[destination setValue:self.chosenDiary forKey:@"detailItem"];
}
}else
{
//获取激发视图切换的单元格所在的NSIndexPath
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
//获取激发视图切换的单元格中显示的文件名
NSString *filename = [self.documentFilenames objectAtIndex:indexPath.row];
//获取该文件名对应的FKDiary的存储URL
NSURL *docURl = [self urlForFilename:filename];
//以指定的docUrl创建FKDiary对象
self.chosenDiary = [[FKDiary alloc]initWithFileURL:docURl];
//读取chosenDiary文档
[self.chosenDiary openWithCompletionHandler:^(BOOL success) {
//如果读取成功
if (success) {
ViewController *destination = (ViewController *)segue.destinationViewController;
//将读取成功的chosenDiary传给destination
destination.detailItem = self.chosenDiary;
//调用destination的changeDisplay更新显示
[destination changeDisplay];
}
else
{
NSLog(@"failed to load!");
}
}];
}
}
-(void)deleteDiary
{
//使用动画切换表格的编辑状态
[self.tableView setEditing: !self.tableView.editing animated:YES];
//修改deleteButton按钮的文本
deleteButton.title = [deleteButton.title isEqualToString:@"删除"]?@"完成":@"删除"; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [self.documentFilenames count];
} #pragma mark - UIAlertViewDelegate
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
//获取用户zaiUIAlerView中输入的文件名,并添加.diary扩展名
NSString *filename = [NSString stringWithFormat:@"%@.diary",[alertView textFieldAtIndex:0].text];
//获取云端文档存储的url
NSURL *saveURL = [self urlForFilename:filename];
//创建一个fKDiary (UIDocument的子类)对象
self.chosenDiary = [[FKDiary alloc]initWithFileURL:saveURL];
//保存chosenDiary文档
[self.chosenDiary saveToURL:saveURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if(success)
{
NSLog(@"保存成功");
[self reloadFiles];
//执行masterTodetail segue,导航到查看,编辑日记的视图控制器
[self performSegueWithIdentifier:@"masterToDetail" sender:self]; }else
{
NSLog(@"保存失败");
}
}];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID" forIndexPath:indexPath];
//根据单元格所在的行号获取对应的文档名
NSString *path = [self.documentFilenames objectAtIndex:indexPath.row];
//设置该单元格的文本为文档名取消后缀
cell.textLabel.text = path.lastPathComponent.stringByDeletingPathExtension;
// Configure the cell... return cell;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
//返回UITableViewCellEditingStyleDeleter代表删除
return UITableViewCellEditingStyleDelete;
} /*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
*/ // Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
//获取用户视图删除的行号
NSInteger rowNo = [indexPath row];
//调用NSfileMangaer的removeItemAtURL:error:方法即可删除云端文档
[[NSFileManager defaultManager]removeItemAtURL:[self.documentURLs objectAtIndex:rowNo] error:nil];
//从底层NSArray集合中删除指定数据项
[self.documentFilenames removeObjectAtIndex:rowNo];
//从UITableView程序界面删删除指定表格行
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}

最新文章

  1. Mac os装软件时提示显示需要安装旧Java SE 6运行环境解决办法
  2. 自动化运维工具ansible学习+使用ansible批量推送公钥到远程主机
  3. 关于ios8模拟器不能输入中文问题以及软键盘不弹出问题
  4. 【python-mysql】在ubuntu下安装python-mysql环境
  5. HTML/CSS的学习过程一览
  6. [C++]指针浅析
  7. iOS导航标题不居中问题(转载)
  8. 【转】Python中实现远程调用(RPC、RMI)简单例子
  9. golang动态加载原生代码思路
  10. 近期wxss总结
  11. IP报文头详解
  12. Python介绍及环境配置
  13. Vue项目初始
  14. 更改linux下文件目录权限、拥有者及用户组
  15. Javascript 思维导图 绘制基础内容(值得一看)
  16. 关于在iBatis中配置Oracle以及MySQL 自增字段
  17. string logo online customization
  18. Oracle查看及修改Oracle最大连接数
  19. Python中类的属性的访问控制
  20. 生死系列--SongXingZhi

热门文章

  1. Lombok的利弊
  2. 2 - 基于ELK的ElasticSearch 7.8.x技术整理 - java操作篇 - 更新完毕
  3. centos6.5-svn搭建文档
  4. Jenkins_创建git任务(3)
  5. GOF23种设计模式之单例模式(java)
  6. spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】
  7. 第10组 Alpha冲刺 (3/6)
  8. 创客系列教程——认识LED灯
  9. zip压缩,解压
  10. Java的八大基本数据类型