kvc是用来方便的设置实例的属性值的,比如person类的实例p1有一个name的属性,那么我们可以通过kvc去设置p1的name,语法是:

[ 对象 setValue:@"xiaming" forKey:@"name"];其中xiaoming就是p1的name,这个就相当于用点语法给p1设置name:p1.name = @"xiaoming";

以上就是kvc的简单实用。接下来是kvo,kvo是键值观察,如果我想知道某个值,是否变化,变成什么,不可能一直去访问人家然后进行对比看有没有变化。在xcode中有一个方法用来方便的知道我们要观察的值是否变化,并在变化了之后触发响应的事件,具体操作如下:

假如我想知道某个累的name属性和age 属性是否变化,并在变化后触发响应的处理方法,就要先添加观察者:

 //    设置两个观察者观察name和age的值是否变化
[self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:@"name"];
[self addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:@"age"];

以上代码添加了两个需要观察的值,分别是name和age,其中后面的context是我们后期使用kvo时用来区别究竟是name改变还是age改变才触发的kvo。添加了观察者之后,我们需要在程序运行的时候name和age 自动变化,那只好设置一个定时器喽:

声明定时器:

     NSTimer *timenow;

设置定时器的频率和触发的方法:(设置1.5s触发一次,触发haha:方法)

1     timenow = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(haha:) userInfo:nil repeats:YES];

设置完成后我们需要实现定时器中的haha:方法:

 //定时器方法
-(void)haha:(id)sender{ NSString *outString = [NSString stringWithFormat:@"current%d",arc4random()%];
self.name = outString;
self.age = outString;
}

在这个方法中我们随机给name和age赋值。

接下来就是设置键值观察:也就是当检测到我们观察的两个属性值改变时该如何处理:

 //设置键值观察,也就是观察值改变的时候所触发的方法。
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSString *contextString = [NSString stringWithFormat:@"%@",context];
if ([contextString isEqualToString:@"age"]) {
NSLog(@"ageobser%@",[change objectForKey:@"new"]);
}else{
NSLog(@"nameobser%@",[change objectForKey:@"new"]);//打印有变化的信息中的new值,也就是变化后的值
} // NSLog(@"%@",change);// 打印所有变化的相关信息 }

以上键值观察中通过if判断响应函数读入的context生成的字符串contextString去判断是由哪个所观察的键值改变后触发的kvo,然后根据情况进行处理,如果观察的键值多的话可以用switch case语句进行判断执行。还有另一种方法去判断是哪个观察者触发的:

 if ([keyPath isEqualToString:@"name"]) {
NSLog(@"nameobser%@",[change objectForKey:@"new"]);
}else{
NSLog(@"ageobser%@",[change objectForKey:@"new"]);
}

也就是通过Keypath去判断。因为我们在添加观察者的时候已经设定了不同的keypath有不同的字符串属性。

释放观察者:

 //移除观察者
-(void)dealloc{
[self removeObserver:self forKeyPath:@"name"];
[self removeObserver:self forKeyPath:@"age"];
}

执行结果为;

 -- ::39.057 FirstLessonOfUI[:] nameobsercurrent84
-- ::39.058 FirstLessonOfUI[:] ageobsercurrent84
-- ::40.558 FirstLessonOfUI[:] nameobsercurrent36
-- ::40.558 FirstLessonOfUI[:] ageobsercurrent36
-- ::42.058 FirstLessonOfUI[:] nameobsercurrent51
-- ::42.059 FirstLessonOfUI[:] ageobsercurrent51
-- ::43.557 FirstLessonOfUI[:] nameobsercurrent99
-- ::43.558 FirstLessonOfUI[:] ageobsercurrent99
-- ::45.058 FirstLessonOfUI[:] nameobsercurrent99
-- ::45.058 FirstLessonOfUI[:] ageobsercurrent99

IOS开发-OC学习-kvc,kvo的更多相关文章

  1. iOS开发笔试面试- KVC/KVO简单使用

    转自:http://my.oschina.net/caijunrong/blog/510701 一.对于KVC模式(Key Value Coding): 1.其实在实际开发中用得比较多得就是:接收到j ...

  2. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  3. iOS开发-OC语言 (一)oc数据类型

    分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型.指针数据类型 基本数据类型:数值型.字符型(char).布尔型.空类型(void) 指针数据类型: ...

  4. iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

    在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握 ...

  5. iOS开发如何学习前端(2)

    iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...

  6. iOS开发如何学习前端(1)

    iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...

  7. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  8. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  9. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路

    在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...

  10. IOS开发---菜鸟学习之路--(一)

    PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...

随机推荐

  1. CodeForces 429 B B. Working out

    Description Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to loo ...

  2. Dev之ChartControl控件(一)

    ChartControl控件主要包括Chart Title,Legend,Annotations,Diagram,Series五部分:如图: 1.  用RangeControl控件控制ChartCon ...

  3. VLAN及Trunk实验

    VLAN及Trunk实验 一 基本VLAN试验 实验拓扑: 实验目的:掌握VLAN基本配置 掌握静态接口VLAN划分 实验需求:在交换机switch上面创建两个VLAN,vlan2和vlan3,vla ...

  4. linux logrotate配置

    对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以使用logrotate 程序用来管理系统中的最新的事件,对于Linux 的系统安全来说,日志文件是极其重要的工具.系统管理员可以 ...

  5. launchMode 和 onNewIntent 关系 任务栈知识.

    onNewIntent(Intent intent). 的调用时候.  当启动一个activity时候,如果launchMode是singletop. 或者 singletask,活着singleIn ...

  6. UI和UE有什么区别呢?

    UCD(以用户为中心的设计)UE(用户体验)UI(用户界面)HCI(人机交互)usability(易用性)

  7. C#入门经典(第三章-1)

    #region--------#endregion 此关键字 将设置代码是否可以折叠和展开.但是他们不是C#关键字.注意:带#的是预处理指令,严格说不是C#关键字. 变量:

  8. 条形图(diagrams)

    条形图(diagrams) 题目描述 小 虎刚上了幼儿园,老师让他做一个家庭作业:首先画3行格子,第一行有3个格子,第二行有2个格子,第三行有3个格子.每行的格子从左到右可以放棋子,但要 求除第一行外 ...

  9. C# 验证数字

    /// <summary> /// 验证数字 /// </summary> /// <param name="number">数字内容</ ...

  10. 关于UIView及其子类重绘drawRect

    转载自:https://nezha.gitbooks.io/ios-developmentarticles/content/UIView%E7%9A%84drawRect%E9%87%8D%E7%BB ...