【day05_1_UserDefault】:判断应用程序是否是第一次运行

NSUserDefaults:用来保存应用程序的配置信息如:程序运行次数,用户登陆信息等。

// 使用系统提供的NSUserDefaults对象判断

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

int runCount = [[userDefaults objectForKey:@"runCount"] intValue];

if (runCount == 0) {

NSLog(@"第一次运行!!!");

}

runCount++;

[userDefaults setObject:[NSNumber numberWithInt:runCount] forKey:@"runCount"];

[userDefaults synchronize]; // 同步

练习:三个界面ABC,运行次数奇数次进C,偶数次进B

在MXAppDelegate.m中写

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

// 因为那个箭头可以直接确定谁是rootViewController,所以可以简化代码

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

int runCount = [[userDefaults objectForKey:@"runCount"] intValue];

if (runCount % 2 == 0) {

UIViewController *bVC = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"bVC"];

[self.window.rootViewController presentViewController:bVC animated:YES completion:nil];

self.window.rootViewController = bVC;

}

runCount++;

[userDefaults setObject:[NSNumber numberWithInt:runCount] forKey:@"runCount"];

[userDefaults synchronize]; // 同步

return YES;

}

【day05_2_ArrayArchiver】:数组归档的使用

归档的使用:把对象转成二进制NSData,可以进行保存或网络传输

如何实现归档:需要让对象实现NSCoding协议

已经实现了NSCoding协议的对象有:数组和字典

数组归档:

// 数组归档

NSArray *namesArray = @[@"张三",@"李四",@"王五"];

// 1.创建可变的data对象,装数据

NSMutableData *data = [NSMutableData data];

// 2.创建归档对象

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

// 3.把对象编码

[archiver encodeObject:namesArray forKey:@"names"];

// 4.编码完成

[archiver finishEncoding];

// 5.保存归档

[data writeToFile:@"/Users/tarena/Desktop/namesArchiver" atomically:YES];

数组反归档:

// 数组反归档

// 1.得到data

NSData *data = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/namesArchiver"];

// 2.创建反归档对象

NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

// 3.解码并存到数组中

NSArray *namesArray = [unArchiver decodeObjectForKey:@"names"];

// 4.循环打印

for (NSString *name in namesArray) {

NSLog(@"%@",name);

}

【day05_3_DictionaryArchiver】字典的归档反归档和数组一样。

【day05_4_AddStringToArchiver】:添加输入框内容到textView中,关闭程序后textView中内容还在,(让UITextView不可编辑,勾掉Editable)

这个使用到归档,代码:

// 加载数组归档数据

-(void)loadInfo{

// 从归档中取数据

// 数组反归档

self.namesTextView.text = @"";

NSData *nameData = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/nameArrayArchiver"]; // 得到data

NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiver alloc] initForReadingWithData:nameData]; // 创建反归档对象

self.nameArray = [unarc decodeObjectForKey:@"names"]; // 解码

for (NSString *name in self.nameArray) { // 取出数组中数据拼接到textView

self.namesTextView.text = [self.namesTextView.text stringByAppendingFormat:@"%@\n",name];

}

}

// 添加姓名

- (IBAction)addNameToTextView:(id)sender {

NSString *name = self.nameTextField.text; // 取出输入的字符串

NSMutableArray *mutableNameArray = [NSMutableArray arrayWithArray:self.nameArray]; // 把不可变数组变为可变数组

[mutableNameArray addObject:name]; // 添加字符串到数组中

// 数组归档

NSMutableData *nameData = [NSMutableData data]; // 创建可变data对象

NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:nameData]; // 创建归档对象

[arc encodeObject:mutableNameArray forKey:@"names"]; // 给数组编码

[arc finishEncoding]; // 编码完成

[nameData writeToFile:@"/Users/tarena/Desktop/nameArrayArchiver" atomically:YES]; // 保存到指定的路径

[self loadInfo];

}

总结:反归档如果返回数组,一般用NSArray接收,如果在程序中要改变NSArray的值,要先把它转成可变数组,然后把这个新数组重新归档。

注意归档时,要创建可变的NSData对象。

【day05_5_ArchiverPerson】:对象可以归档反归档必须做的事

1.遵守NSCoding协议

2.实现该协议的两个方法

代码如下:

// 属性编码

- (void)encodeWithCoder:(NSCoder *)aCoder{

[aCoder encodeObject:self.name forKey:@"name"];

[aCoder encodeInteger:self.age forKey:@"age"];

}

// 属性解码

- (id)initWithCoder:(NSCoder *)aDecoder{

self = [super init];

if (self) {

self.name = [aDecoder decodeObjectForKey:@"name"];

self.age = [aDecoder decodeIntegerForKey:@"age"];

}

return self;

}

【day05_6_PersonsArchiver】:人员名单,功能有添加人员,删除人员,修改人员。使用归档。

添加:

添加时要跳转到新的界面,一般这么做:

1.如果第一个界面用navigation包含了就把整个界面push到第二个界面,使用viewController连接。

2.然后设置该连线也就是segue的identifier值。

3.然后第一个界面中的控件或是tableView的cell通过一个方法[selfperformSegueWithIdentifier:@"personInfoVC"sender:person];进行segue跳转并可以传值。

4.在segue跳转前还有一个方法可以把传的值赋给要跳转的界面,就是- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

在添加界面中首先把归档的数据取出来添加进去,然后把新的数据重新归档。

添加代码如下:

// 添加数据

- (IBAction)addOrEditButtonAction:(id)sender {

// 添加

MXPerson *person = [[MXPerson alloc] init];

person.name = self.nameTextField.text;

person.age = [self.ageTextField.text intValue];

// 首先需要取出归档数据,在往里添加

NSData *data = [NSData dataWithContentsOfFile:@"/Users/tarena/Desktop/persons"];

NSKeyedUnarchiver *unarc = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

NSArray *oldPersonArray = [unarc decodeObjectForKey:@"persons"];

NSMutableArray *newPersonArray = [NSMutableArray arrayWithArray:oldPersonArray];

[newPersonArray addObject:person]; // 添加数据

// 把对象归档

NSMutableData *personData = [NSMutableData data];

NSKeyedArchiver *arc = [[NSKeyedArchiver alloc] initForWritingWithMutableData:personData];

[arc encodeObject:newPersonArray forKey:@"persons"];

[arc finishEncoding];

[personData writeToFile:@"/Users/tarena/Desktop/persons" atomically:YES];

[self.navigationController popViewControllerAnimated:YES];

}

修改:

点击cell后跳到修改界面,然后点击按钮修改。

在跳转时要把当前cell(也就是数组中的某个元素)的数据传到修改界面并显示,修改数据后重新归档。

因为在修改界面要用到第一个界面中数组数据,所以在跳转到修改界面前把自己赋给修改界面的delegate(该代理的类型就是第一个界面),然后进行修改并重新归档。

注意:在跳转时会有多个sender值,在跳转界面要做判断。本例中点击添加,传的sender是nil,点击cell传的sender就是该cell数据。

代码如下:

// 点击cell后跳转到修改界面并传cell的数据

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

MXPerson *person = self.personArray[indexPath.row];

[self performSegueWithIdentifier:@"personInfoVC" sender:person];

}

// segue跳转前把数据赋给修改界面

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

MXViewController *personInfoVC = segue.destinationViewController;

personInfoVC.person = sender;

personInfoVC.delegate = self;

}

// 添加或修改数据

- (IBAction)addOrEditButtonAction:(id)sender {

if (self.person) { // 修改

self.person.name = self.nameTextField.text;

self.person.age = [self.ageTextField.text intValue];

[self.delegate savePerson];

} else{ // 添加

}

[self.navigationController popViewControllerAnimated:YES];

}

删除:

从归档中删除,然后保存归档

代码如下:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

{

if (editingStyle == UITableViewCellEditingStyleDelete) {

[self.personArray removeObjectAtIndex:indexPath.row]; // 从归档中删除

[self savePerson]; // 保存归档

[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

}

}

高级UIKit-04(NSUserDefaults、NSKeyedArchiver、对象归档方法)的更多相关文章

  1. iOS文档序列化(对象归档)

    对象归档: 概念: 对象归档是指将对象写入文件保存在硬盘,当再次又一次打开程序时,能够还原这些对象.也称:对象序列化.对象持久化. 数据持久性的方式(事实上就是3类) 1,NSKeyedArchive ...

  2. iOS数据存储之对象归档

    iOS数据存储之对象归档 对象归档 对象归档是iOS中数据持久化的一种方式. 归档是指另一种形式的序列化,但它是任何对象都可以实现的更常规的类型.使用对模型对象进行归档的技术可以轻松将复杂的对象写入文 ...

  3. iOS 数据持久化(1):属性列表与对象归档

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  4. 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作

    ios中数据持久化存储方式一般有5种:NSUserDefault.对象归档(NSKeyedArchiver).文件操作.数据库存储(SQLite3).CoreData. 1.NSUserDefault ...

  5. Python的高级特性8:你真的了解类,对象,实例,方法吗

    Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

  6. jvm高级特性(2)(判断存活对象算法,finaliza(),方法区回收)

    JVM高级特性与实践(二):对象存活判定算法(引用) 与 回收 垃圾回收器GC(Garbage Collection) 于1960年诞生在MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语 ...

  7. 06JS高级创建对象使用原型共享对象方法

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. JS高级——扩展内置对象的方法

    基本概念 内置对象有很多,几个比较重要的:Math.String.Date.Array 基本使用 1.内置对象创建出来的对象使用的方法使用的其实都是内置对象的原型对象中的方法 (1)a并没有charA ...

  9. iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档

    1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...

随机推荐

  1. fopen()函数

    1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都能够通过文件管理的方法来完毕.而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 具体介绍Turb ...

  2. tomcat的集群配置

    配置环境需要:1.Apache服务器,下载地址:http://httpd.apache.org/download.cgi#apache22 2.tomcat6.0或者tomcat7.0,(集群中tom ...

  3. GridView事件分析

    GridView事件分析 (转) P1默认数据绑定过程 编号 事件名称 作用 E1 DataBinding 数据绑定之前触发,在这个事件之前(第一次生成GridView),GridView不存在行数据 ...

  4. JS获取DropDownList的value值与text值

    <script type="text/javascript" language="javascript"> function SearchChang ...

  5. boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等

    一.使用同步定时器 这个示例程序通过展示如何在一个定时器执行一个阻塞等待. //makefile #-------------------------------------------------- ...

  6. 孙弘与Masa Maso 做互联网最贵的衬衫(2)_人物对话_中国时尚品牌网

    孙弘与Masa Maso 做互联网最贵的衬衫(2)_人物对话_中国时尚品牌网 孙弘与Masa Maso 做互联网最贵的衬衫(2)

  7. windows 不能在 本地计算机 启动 Apache

    可能是Apache 的监听端口与其他软件有冲突,这是新手常犯的一个错误,Windows安装了IIS服务器的同时,又安装Apache服务器,二个服务器软件都监听TCP/IP协议的80端口,于是就有其中的 ...

  8. diff两个文件夹里的东西

    diff --help -x, --exclude=PAT               exclude files that match PAT 排除某个类型的文件 -u, -U NUM, --uni ...

  9. <转> 30 个有关 Python 的小技巧

    目录[+] 1.1 拆箱 1.2 拆箱变量交换 1.3 扩展拆箱(只兼容python3) 1.4 负数索引 1.5 切割列表 1.6 负数索引切割列表 1.7指定步长切割列表 1.8 负数步长切割列表 ...

  10. Python 模块续和面向对象的介绍(六)

    一.基本模块 shutil 文件.目录.压缩包的处理模块 shutil.copyfile(src, dst) 拷贝文件 >>> shutil.copyfile('a.log','b. ...