数据存储

1.1.3.使用通知传值

1.2.Segue使用

2. KVC&&KVO2.1.什么是KVC

KVC - Key Value Coding键值(路径)编码KVC是一种间接修改/读取对象属性的一种方式KVC被称为苹果开发的大招!

KVC在使用时,需要注意,键值名称在对象属性中必须存在,否则会崩溃!

2.2.什么是KVO

Key Value Observer键值观察(观察者模式)

通知中心同样也是观察者模式

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......2.3.KVC设置值

2.3.1.给字符串属性 和 数值属性赋值

Person*p = [[Personalloc]init];//使KVC来给对象赋值

[psetValue:@"李四"forKeyPath:@"name"];

//给数值型属性赋值时,同样可以使 字符串[psetValue:@"18"forKeyPath:@"age"];

2.3.2.给对象属性赋值

Student*stu = [[Studentalloc]init];

[stusetValue:@"李四"forKeyPath:@"name"];

[stusetValue:@"18"forKeyPath:@"age"];

[stusetValue:@"20"forKeyPath:@"number"];Book*book = [[Bookalloc]init];

stu.book= book;

//使KVC给Book赋值

[stusetValue:@"iPhone"forKeyPath:@"book.bookName"];

2.4.KVC取值

Student*stu = [[Studentalloc]init];

[stusetValue:@"lisi"forKeyPath:@"name"];

[stusetValue:@"18"forKeyPath:@"age"];

[stusetValue:@"20"forKeyPath:@"number"];

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......

Book*book = [[Bookalloc]init];

stu.book= book;

[stusetValue:@"iPhone"forKeyPath:@"book.bookName"];

Student*stu1 = [[Studentalloc]init];

[stu1setValue:@"wangwu"forKeyPath:@"name"];

[stu1setValue:@"18"forKeyPath:@"age"];

[stu1setValue:@"20"forKeyPath:@"number"];Book*book1 = [[Bookalloc]init];

stu1.book= book1;

[stu1setValue:@"ios"forKeyPath:@"book.bookName"];

NSArray*students =@[stu,stu1];//需求,将两个学 的姓名 成 个数组

//普通做法

//

//

//

//

//

//

//

//

NSMutableArray *arrayM = [NSMutableArray array];

for (Student *stu in students) {

[arrayM addObject:stu.name];

}

NSLog(@"%@", arrayM);

KVC取值

使KVC取值的时候,如果当前对象不包含指定的键值

那么KVC会进 对象内部,继续搜索!

NSLog(@"%@", [studentsvalueForKeyPath:@"name"]);NSLog(@"%@", [studentsvalueForKeyPath:@"book.bookName"]);

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......2.5.KVO的使用

2.5.1.设置监听

Student *stu = [[Student alloc] init];

stu.name =@"wangwu";

stu.age =16;

stu.number =20;

Book *book = [[Book alloc] init];

book.bookName =@"ios";

stu.book = book;self.student =stu;

//谁来监听 监听谁

//观察student的属性变化

// 1> self负责监听的对象

通知中 负责

NSNotificationCenter是由

// 2> keyPath要观察的属性键值路径,KVO主要 于对模型属性变化进

观察的 种模式

//通知中 是通过对象POST字符串给通知中 来达到观察 的的

// 3>选项"|"(并且)位运算,可以同时 持多个选项

// 4>上下

[stu addObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionNew|NSKeyValueObservingO

ptionOld context:@"student"];

stu.name =@"lisi";

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......2.5.2.监听代理

//分类: 被称为:隐式代理,灵活度很 ,但是代码的可读性不好,不建议

使 !

//  delegate ->显式代理//

//观察监听 法,所有的监听事件发 时,都统 调 监听者的此 法!

//  1> keyPath

//  2> object

//  3> change

//  4> context

观察的键值路径

观察的对象

改变,新、旧数值发送过来

上下 ,建 观察时指定的上下 ,如果同时监听多个属

性,可以通过上下 加以区分

-(void)observeValueForKeyPath:(NSString*)keyPath

ofObject:(id)object change:(NSDictionary

*)change context:(void*)context{

NSLog(@"keyPath = %@ , object = %@ , change = %@ ,context

= %@", keyPath, object, change, context);

}

3. RGB颜色黑色是一点颜色都没有,白色包含了所有的颜色

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......4.数据存储

4.1.本质所有数据存储的本质都是做数据持久化,也就是写入文件

4.2.存储方式

NSUserDefaults存储

自定义文件存储Plist,txt,xml数据库存储sqlite

网络存储

3.应用之间通信和分享数据的机制http://blog.csdn.net/tenfyguo/article/details/9063675

4.3.沙盒介绍

沙盒路径是应用程序专门为用户存储数据而存在的目录** /Users/...../Data/...这个是沙盒路径。

** /Users/...../Bundle/....这个是Bundle路径。

而bundle路径是应用程序安装路径。

每个应用程序只能访问自己的沙盒路径。

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......4.4.沙盒目录结构

4.4.1. Documents目录:保存应用程序自己的数据(比如:游戏进度存档、软件的一些个人设置等)。通过iTunes、

iCloud备份时,会备份这个目录下的数据。

4.4.2. Tmp目录:

存储一些其他临时数据,系统磁盘空间不够,手机重启时,会自动清除这个目录的数

据。无需程序员手动清除该目录中的数据.iTunes、iCloud备份时,不会备份这个目录下的数

据。

4.4.3. Caches目录:

保存从网络上下载的文件(比如:听歌时的缓存、图片的缓存等),这个目录下的数据

不会被自动删除,需要程序员自己实现清除目录数据功能。iTunes、iCloud备份时,不会备

份这个目录下的数据。

4.4.4. Preference目录:

保存通过"偏好设置"写入的数据。iTunes、iCloud备份时,会备份这个目录下的数据。

4.5.沙盒路径

4.5.1.获取沙盒根目录-拼接方式

NSString *path = NSHomeDirectory();

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......4.5.2.路径拼接

path = [path stringByAppendingString:@”/Documents”];

path = [path stringByAppendingPathComponent:@”Documents”];

4.5.3.获取沙盒全路径-系统方式[NSSearchPathForDirectoriresInDomains() firstObject];

yes是绝对路径no是相对路径

NSSearchPathDomainMask

[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

NSUserDomainMask =1,//户主 录中NSLocalDomainMask =2,//当前机器中NSNetworkDomainMask =4,//络中可 的主机NSSystemDomainMask =8,//系统 录,不可修改(/System)NSAllDomainsMask =0x0ffff,//全部

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......4.6.文件读写

4.6.1. plist文件读写写入字典:

[dict writeToFile:path atomically:YES];

读取字典:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

缺点:

通过plist文件来保存数据,无法直接将一个对象保存到文件中。

4.7.偏好读写

本质就是通过plist文件存储数据

但是使用起来更简单(无需关注文件、文件夹路径和名称)。目录每次都会发生改变

通过"偏好设置"的 式读、写 件时,路径在"沙盒根 录"->"Library"->"Preferences"

数据只能存储在一个文件中,不存储大批量数据(很多时候大批量数据要分多个文件存储)

4.7.1.写入

NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];

[defaultssetObject:@"zhangsan"forKey:@"name"];

[defaultssetBool:YESforKey:@"sex"];

[defaultssetInteger:20forKey:@"age"];

[defaultssynchronize];

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......4.7.2.读出

NSUserDefaults*defaults = [NSUserDefaultsstandardUserDefaults];NSString*name = [defaultsobjectForKey:@"name"];BOOLsex = [defaultsboolForKey:@"sex"];NSIntegerage = [defaultsintegerForKey:@"age"];

4.7.3.缺点

通过"plist"文件来保存数据,无法直接将一个对象保存到文件中。比如Person对象就没有

writeToFile方法。而偏好设置只能存储少量数据,对于大数据存储不适合4.7.4.注意

使用对象:仅仅是Foundation框架中的一些类,比如:

NSString\NSArray\NSDictionary\NSSet\NSNumber\NSData,对于其它数据类型不能直接存

储。

5.数据归档5.1.特点

"归档"是一种可以把任何对象,直接保存为文件的方式。(其中包括"归档"与"反归档(读档)")

5.2.前提必须是实现协议

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......通过"归档"的方式来存储,对象必须遵守NSCoding协议,也就意味着通过"归档"的方式能

将任何遵守了NSCoding协议的"对象"存储到文件中

5.3.归档可以归档数组

重点:子类必须也要让父类归档。

5.4.反归档

重点:父类必须init,子类必须也要调用父类的反归档

6.完善登录业务6.1.偏好设置-写入

写入自动登录和记住密码状态

写入用户名密码

//户偏好数据写

- (void)userDefaultWrite

{

standardUserDefaults];//2.写 数据

BOOLisremerberPwd=self.rememberPwd.on;BOOLisAutoLogin=self.autoLogin.on;

//写  动登录和记住密码的属性值

[udsetBool:isremerberPwdforKey:@"isremerberPwd"];

//1.创建偏好写 对象

NSUserDefaults*ud=[NSUserDefaults

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

6.2.写入时间当登录成功时写入

6.3.自动登录

想要高薪就业?还等什么?照着文档不停的敲吧.......

[udsetBool:isAutoLoginforKey:@"isAutoLogin"];

//判断是否是记住密码,如果是就再写  户名和密码

if(isremerberPwd) {

[udsetObject:self.nameView.textforKey:@"name"];

[udsetObject:self.pwdView.textforKey:@"pwd"];

}

//3.同步

[udsynchronize];

}

[selfuserDefaultWrite];

//动登录功能

- (void)autoLoginAction{

//读取偏好

NSUserDefaults*ud=[NSUserDefaultsstandardUserDefaults];

BOOLisremerberPwd=[udboolForKey:@"isremerberPwd"];BOOLisAutoLogin=[udboolForKey:@"isAutoLogin"];

//赋值开关

[self.rememberPwdsetOn:isremerberPwdanimated:YES];

[self.autoLoginsetOn:isAutoLoginanimated:YES];

//判断是否是记住密码如果是就再填  户名和密码

if(isremerberPwd) {self.nameView.text=[udobjectForKey:@"name"];self.pwdView.text=[udobjectForKey:@"pwd"];

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......

}if(isAutoLogin) {

// [self login:nil];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW,

(int64_t)(0.5*NSEC_PER_SEC)),dispatch_get_main_queue(),

^{

[selflogin:nil];

});

}

}

6.4.注意:在主队列启动登录

if(isAutoLogin) {//这样不能移除提 框

// [self login:nil];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW,

(int64_t)(0.5*NSEC_PER_SEC)),dispatch_get_main_queue(),

^{

[selflogin:nil];

});

}

7.私人通讯录数据归档7.1.模型类

7.1.1.模型类-实现归档协议

@interfaceCZContact :NSObject

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......7.1.2.模型类-归档

//归档

- (void)encodeWithCoder:(NSCoder*)aCoder

{

[aCoderencodeObject:self.nameforKey:@"name"];

[aCoderencodeObject:self.phoneforKey:@"phone"];

}

7.1.3.模型类-反归档

//反归档

- (instancetype)initWithCoder:(NSCoder*)aDecoder

{

if(self=[superinit]) {self.name=[aDecoderdecodeObjectForKey:@"name"];self.phone=[aDecoderdecodeObjectForKey:@"phone"];

}

return self;

}

7.2.控制器7.2.1.数据归档

//对联系 数据进 归档存储

- (void) saveContact

{

NSString

*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentD

irectory,NSUserDomainMask,YES)lastObject];

NSString*filePath=[docPathstringByAppendingPathComponent:@"contact.data"];

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......

//归档操作

[NSKeyedArchiverarchiveRootObject:self.contactstoFile:filePath];

}

7.2.2.数据归档位置—添加联系人

- (void) addBtnDidClick:(AddViewController*)vc

withContact:(CZContact*)contact{

//1.添加模型到数组

[self.contactsaddObject:contact];

//2.刷新表格

[self.tableViewreloadData];

//3.进 数据--归档

[selfsaveContact];

}

7.2.3.数据归档位置—修改联系人

- (void)editBtnDidClick:(EditViewController*)vc{//刷新tableView

// [self.tableView reloadData];

NSIndexPath*indexPath=self.tableView.indexPathForSelectedRow;

[self.tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade];

//数据存储

[selfsaveContact];

}

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......7.3.数据源

源数据从归档文件中加载

//懒加载--从归档 件中获得数据

- (NSArray*)contacts

{

if(_contacts==nil) {NSString

*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentD

irectory,NSUserDomainMask,YES)lastObject];

NSString*filePath=[docPathstringByAppendingPathComponent:@"contact.data"];

_contacts=[NSKeyedUnarchiverunarchiveObjectWithFile:filePath];

if(_contacts==nil)//有可能为nil{

_contacts=[NSMutableArrayarray];

}

}

return_contacts;

}

8.项目删除联系人8.1.tableViewCell左滑出现删除按钮

//实现此 法就可以实现cell的左边滑动出删除按钮了

- (void)tableView:(UITableView*)tableView

commitEditingStyle:(UITableViewCellEditingStyle)editingSt

yle forRowAtIndexPath:(NSIndexPath*)indexPath{

}

//确定删除按钮的 本

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

8.2.删除联系人操作

想要高薪就业?还等什么?照着文档不停的敲吧.......

- (NSString*)tableView:(UITableView*)tableView

titleForDeleteConfirmationButtonForRowAtIndexPath:(NSInde

xPath*)indexPath

{

return@"删除";

}

//实现此 法就可以实现cell的左边滑动出删除按钮了//只有删除状态才有删除按钮的显  和 点击删除按钮的回调操作

- (void)tableView:(UITableView*)tableView

commitEditingStyle:(UITableViewCellEditingStyle)editingSt

yle forRowAtIndexPath:(NSIndexPath*)indexPath{

//先删除数据源

[self.contactsremoveObjectAtIndex:indexPath.row];

//重新归档--就是删除归档 件中的已经删除的联系[selfsaveContact];

//再删除tableView中的显

[self.tableViewdeleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade];

}

//对联系 数据进 归档存储

- (void) saveContact

{

NSString

*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentD

irectory,NSUserDomainMask,YES)lastObject];

NSString*filePath=[docPathstringByAppendingPathComponent:@"contact.data"];

//归档操作--归档数组  的所有对象,也就是说先删除 件中的所有对

传智播客致力打造专业的IT实战培训课程——务实、创新、质量、专注、分享、责任

想要高薪就业?还等什么?照着文档不停的敲吧.......

象,然后重新归档

[NSKeyedArchiverarchiveRootObject:self.contactstoFile:filePath];

}

9. QQ主流框架9.1.目的

这个案例主要是综合使用UITabBarController和UINavigationController.复习静态单元格的创建和使用

进一步的掌握多控制器的管理。

9.2.项目框架

注意:TableViewController:

Content : Static Cells

Style : Grouped

TableViewCell:

Style : Basic

Accessory : Disclosure Indicator

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容