仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3138|回复: 19
打印 上一主题 下一主题

[学习教程] IOS编程:iOS KVC & KVO仓酷云

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:35:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
用代码控制view意思他们玩的都是高科技IB都是垃圾很多人也纠结到底用不用IB的确很多时候IB灵活度不行但是不需要灵活度的时候还不用IB那不是装X吗要是没人用苹果还开发IB干嘛早去掉了IB在很多时候节省很多工作量UINavigationController再说说NavigationController刚接触开发的时候不明白View和View之间怎么切换的KeyValueCoding

KeyValueCoding是cocoa的一个尺度构成部分,它能让我们能够经由过程name(key)的体例会见property,不用挪用明白的propertyacCSSor,如我们有个property叫做foo,我们能够foo间接会见它,一样我们也能够用KVC来完成[ObjectvalueForKey:@“foo”],有同砚就会问了,如许做有甚么优点呢?次要的优点就是来削减我们的代码量。
上面我们来看看几个例子,就分明了KVO的用法亲睦处了,假定如许个类叫做People,
  1. 123456
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end
复制代码


场景1,apple官网的一个例子,当我们必要统计良多People的时分,每行是一团体的实例,而且有2列属性,name,age,这时候候我们能够会如许做,
  1. 123456789101112
复制代码
  1. -(id)tableView:(NSTableView*)tableviewobjectValueForTableColumn:(id)columnrow:(NSInteger)row{People*people=[peoleArrayobjectAtIndex:row];if([[columnidentifier]isEqualToString:@"name"]){return[peoplename];}if([[columnidentifier]isEqualToString:@"age"]){return[peopleage];}//Andsoon.}
复制代码


一样我们也能够用KVC,匡助我们化简这些if,由于name,age实在都是property,我们能够间接经由过程key来会见,以是收拾事后是
  1. 12
复制代码
  1. People*people=[peopleArrayobjectAtIndex:row];return[peoplevalueForKey:[columnidentifier]];
复制代码


场景2,这下我们有了server,server的某个api(listPeople??),会前往我们json格局一个数组,内里包括如许dict{name:xx,age:xx}如许的数据,我们但愿用这些dict数据机关出我们的people来,一般我们的做法是,为我们People类写一个staticfactory办法专门用来处置dict来,把dict内里的数据掏出来,然后创立个空的People对象,然后顺次设置property。但是当如许相似People的与server交互的类多了,我们就要为每一个类都要加上如许的wrapper,是不是有种复杂举措来设置如许的属性,固然就是我们的KVC了。
  1. 123456789
复制代码
  1. -(id)initWithDictionary:(NSMutableDictionary*)jsonObject{if((self=[superinit])){[selfinit];[selfsetValuesForKeysWithDictionary:jsonObject];}returnself;}
复制代码


setValuesForKeysWithDictionary,会为我们把和dictionary的key名字不异的classproerty设置上dict中key对应的value,是否是很便利呀,可是有同砚又要问了假如json内里的某些key就是和object的property名字纷歧样呢,大概有些server前往的字段是objc保存字如”id”,“description”等,我们也但愿也mapdicttoobject,这时候候我们就必要用上setValue:forUndefinedKey,由于假如我们不处置这些UndefinedKey,仍是用setValuesForKeysWithDictionary就会抛出非常。
  1. 123456789
复制代码
  1. -(void)setValue:(id)valueforUndefinedKey:(NSString*)key{if([keyisEqualToString:@"nameXXX"])self.name=value;if([keyisEqualToString:@"ageXXX"])self.age=value;else[supersetValue:valueforKey:key];}
复制代码


以是只需重载这个办法,就能够处置了那些没法跟property相婚配的key了,默许的完成是抛出一个NSUndefinedKeyException,又有同砚提问了假如这时候候server前往的People有了内嵌的json(如Products{product1{count:xx,sumPrice:xx}},product2{}….),又该怎样办,能把这个内嵌的json转化成我们的客户真个Product类嘛,固然能够这时候候就必要重载setValue:forKey,独自处置”Products”这个key,把它wrapper成我们必要的class
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end0
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end1
复制代码


场景3,我们必要把一个数组里的People的名字的首字母年夜写,而且把新的名字存进新的数组,这时候候一般做法会是遍历全部数组,然后把每一个People的name掏出来,挪用capitalizedString然后把新的String到场新的数组中。有了KVC就有了新做法:
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end2
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end3
复制代码


我们看到valueForKeyPath,为何用valueForKeyPath,不必valueForKey,由于valueForKeyPath能够传送干系,比方这里是每一个People的nameproperty的String的capitalizedStringproperty,而valueForKey不克不及传送如许的干系,以是关于dict内里的dict,我们也只能用valueForKeyPath。这里我们也看到KVC关于array(set),做了特别处置,不是复杂操纵collection上,而是针对这些collection内里的元素举行操纵,一样KVC也供应更多地操纵,比方@sum这些针对collection,有乐趣的同砚能够往用下。
场景4,当我们实行NSArray*products=[peoplevalueForKey:@“products”],我们但愿的是[peopleproducts],但是people没有如许的办法,KVC又会为我们带来些甚么呢?

  • 起首会往找getProdcutsorproductsorisProducts,依照如许的按次往查找,第一个找到的就前往
  • 然后会往找countOfProductsandeitherobjectInProductsAtIndex:orProductsAtIndexes,假如找到,就会往找countOfProductsandenumeratorOfProductsandmemberOfProducts这个2个办法都找到了,KVC才会给我们前往一个代办署理的NSKeyValueArray,用于我们后续的操纵(addProduct之类的)。
  • 假如有个变量叫做products,isProducts,productsorisProducts,KVC会间接就利用如许的变量,假如你以为间接用如许的变量是损坏了封装,能够克制如许的举动产生,重载+accessInstanceVariablesDirectly,前往NO。
复杂来讲,valueForKey,会给我们带来一个代办署理array,假如我们完成了某些办法,上诉的这些办法只是针对NSArray,关于mutable的collection,我们还必要供应其他办法的完成才行。
KeyValueObserving

KeyValueObserving,望文生义就是一种observer形式用于监听property的变更,KVO跟NSNotification有良多类似的中央,用addObserver:forKeyPath:options:context:往startobserver,用removeObserver:forKeyPath:context往stopobserver,回调就是observeValueForKeyPath:ofObject:change:context:。
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end4
复制代码
  1. @interfacePeople:NSObject@property(nonatomic,strong)NSString*name;@property(nonatomic,strong)NSNumber*age;@end5
复制代码


关于KVO来讲,我们要做的只是复杂update我们的property数据,不必要像NSNotificationCenter那样体贴是不是有人在监听你的哀求,假如没有人监听该怎样办,一切addObserver,removeObserver,callback都是想要监听的你的property的class做的事变。已经做个项目,用NSNotificationCenterpostNotification在一个networkcallback内里,但是这时候候由于最早的addObserver的class被开释了,接着天生的addObserver的class,就承受到了上一个observer该监听的事务,以是形成了毛病,当时候的办理计划是为addObservekey做unique,不会2次addObserver的key是不异的,可是有了KVO,我们一样能够用KVO来完成,当addOberver的的objectremove的时分,就不会有如许的callback被挪用了。

照着书上的例子,一个一个做下来,只要不是文盲,就都会的呀,没有体现我的一点点个人价值。所以我决定了,不能再这样下去
活着的死人 该用户已被删除
沙发
发表于 2015-1-27 12:04:06 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
海妖 该用户已被删除
板凳
发表于 2015-2-3 13:49:07 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
小妖女 该用户已被删除
地板
发表于 2015-2-8 15:31:57 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
分手快乐 该用户已被删除
5#
发表于 2015-2-18 06:52:19 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
变相怪杰 该用户已被删除
6#
发表于 2015-2-24 21:25:23 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-2-27 12:39:29 | 只看该作者
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
再见西城 该用户已被删除
8#
发表于 2015-3-8 14:46:48 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
admin 该用户已被删除
9#
发表于 2015-3-11 20:19:23 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
山那边是海 该用户已被删除
10#
 楼主| 发表于 2015-3-17 02:09:12 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
冷月葬花魂 该用户已被删除
11#
发表于 2015-3-23 13:39:21 | 只看该作者
看《iPhone 4与iPad开发基础教程》,跟着一步步来
愤怒的大鸟 该用户已被删除
12#
发表于 2015-3-27 22:19:19 | 只看该作者
iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
柔情似水 该用户已被删除
13#
发表于 2015-4-9 09:25:15 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
再现理想 该用户已被删除
14#
发表于 2015-4-11 06:17:28 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
兰色精灵 该用户已被删除
15#
发表于 2015-4-16 01:37:27 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
因胸联盟 该用户已被删除
16#
发表于 2015-4-18 00:52:31 | 只看该作者
看完这个你就可以有多种选择来踏入做应用的阶段
乐观 该用户已被删除
17#
发表于 2015-4-18 16:05:53 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
金色的骷髅 该用户已被删除
18#
发表于 2015-4-26 04:11:55 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
19#
发表于 2015-6-5 19:43:08 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
第二个灵魂 该用户已被删除
20#
发表于 2015-7-11 07:36:11 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-19 20:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表