为你的ToDoList添加数据保存功能
来源:互联网 发布:淘宝旅行网日本签证 编辑:程序博客网 时间:2024/05/17 06:33
相信学习IOS的都是从ToDoList开始的吧,官方教程里实现了ToDoList的基本功能,但是数据无法保存,一旦退出后重新进入程序后数据就会丢失,现在给ToDoList添加记忆功能。
要用到的知识:
1.数据保存
2.沙盒概念
3.消息发送
数据保存和沙盒概念在我的上一篇博文已经提到。就是IOS为了安全起见不允许用户随意地写入数据,你没有权限在程序所在的目录写入数据,而只能在官方规定的目录保存用户信息。而这个目录我们可以通过NSSearchPathForDirectoriesInDomains这个函数获得。代码如下:
NSArray* appDocumentPaths=NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
//第二个参数表示在用户主目录中找,第三个参数表示展开完整路径
NSString* appDocumentPath=[appDocumentPaths objectAtIndex:0];
注意一下这个函数是一个C函数,所以我们使用的是C的写法,而不是方括号。
通过上面的语句我们就获得了程序对应沙盒中的Document路径了,然后再在后面添加我们要保存的文件的名称。
由于items保存的类型是我们自定义的类,所以不能直接通过NSArray的WriteTofile来保存,这也让博主很是头疼,最终采用了一种比较笨的方法——分开保存。把items的名字和状态(是否选中)分别保存为两个文件。所以就有了如下代码:
self.itemsPath=[appDocumentPath stringByAppendingString:@"/items.plist"];
self.isDonePath=[appDocumentPath stringByAppendingString:@"/isDone.plist"];
需要注意的是isDone是基本类型不能直接保存在Array里(默默流泪),还必须先封装为NSNumber类型,所以我的保存数据函数如下:
-(void)saveMyData
{
NSMutableArray* itemsToSave=[[NSMutableArray alloc]initWithCapacity:10];
NSMutableArray* isDoneToSave=[[NSMutableArray alloc]initWithCapacity:10];
for (NSInteger i=0; i<[self.items count]; i++) {
JOEToDoItems* item=[self.items objectAtIndex:i];
addObject:item.itemName]; [itemsToSave
NSNumber* isDone=[[NSNumber alloc]initWithBool:item.isDone];
addObject:isDone]; [isDoneToSave
}
if([itemsToSave writeToFile:self.itemsPath atomically:YES]) NSLog(@"Write items OK");
if([isDoneToSave writeToFile:self.isDonePath atomically:YES]) NSLog(@"Write isDone OK");
}
在上面时候保存数据呢?一般我们都觉得在程序关闭的时候调用保存函数就可以来,但是问题是很多时候程序是被意外关闭的,所以最好是在程序进入后台的时候就对数据进行保存,所以在XXXAppDelegate中找到applicationWillResignActive,这个方法会在程序挂起的时候被调用。
如何在这个方法里面调用我们之前编写的-(void)saveMyData?由于两个方法在不同的类里面,我们无法跨类直接调用,这时候就需要采用消息中心来跨类传输数据了。关于消息中心的详细介绍可以自行百度NSNotificationCenter ,简单来说就是在applicationWillResignActive中发送一个消息,然后在 ToDoListTableViewController中添加一个监视(Observer),一旦接受到消息就调用指定的方法。
首先我们在applicationWillResignActive中添加以下代码:
NSNotificationCenter defaultCenter] postNotificationName:@"saveData" object:nil]; [[
//程序挂起时
再在applicationDidBecomeActive里添加:
[[ NSNotificationCenter defaultCenter] postNotificationName:@"readData" object:nil];
//程序在前台时
然后改写ToDoListTableViewController的 viewDidLoad:
- (void)viewDidLoad
{
super viewDidLoad]; [
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(initItems) name:@"readData" object:nil];
NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveMyData) name:@"saveData" object:nil];} [[
这样一旦收到相应的消息就会调用相应的方法。关于initItems方法的具体代码我就不贴出来了,值得注意的是除了初始化items之外,还需要在最后添加一句[self.tableViewreloadData];重新加载数据,因为我在调试中发现,在接收到消息readData的时候ToDoList界面已经加载完成,需要重新载入数据。
这样带数据保存功能的ToDoList就完成了。
0 0
- 为你的ToDoList添加数据保存功能
- 使用本地存储localStorage保存数据的todoList
- 为你的 Blog 添加“天气预报”功能。
- 为你的 Blog 添加“天气预报”功能。
- 为你的blog添加搜索功能
- [J2ME]为照相机添加图片保存功能
- 为照相机添加图片保存功能
- 为照相机添加图片保存功能
- 为你的 Blog 添加“跟随鼠标的文字”功能。
- 为你的blog添加选中翻译的功能
- 为你的 Blog 添加“状态栏文本”功能。
- [转改]为你的 Blog 添加“天气预报”功能。
- [zt]为你的 Blog 添加“天气预报”功能。
- 为你的wordpress添加显示网站截图功能
- 如何为你的WindowsPhone应用添加市场评分功能
- 3分钟为你的应用添加声波通讯功能
- 3分钟为你的应用添加声波通讯功能
- 3分钟为你的应用添加声波通讯功能
- GitHub上README.md教程
- Objective-C学习笔记1
- Objective-C学习笔记2
- Objective-C学习笔记3
- 在ios下保存数据到plist
- 为你的ToDoList添加数据保存功能
- 关于COCOS2d里CCArray使用时的一点…
- 关于TileMap(瓦片地图)
- 关于cocos2dx3.X版本的触摸响应的…
- cocos2dx在VS下Label中文显示乱码…
- Container With Most Water - Leetcode
- 想让安卓 APP 如丝般顺滑?
- ImageMagick 一个图像处理较好的库
- Swift 2.0 异常处理