IPHONE 和 KVC/KVO 监听对象属性变化(例如:获取textView 的text的变化)
来源:互联网 发布:天猫抢购软件神器 编辑:程序博客网 时间:2024/05/19 02:41
1、
在textView的委托法textViewDidChange 只能监听到通过监听到通过键盘输入、删除的内容改变,不能监听到setText,或者myTextView.text=@"Hello",这种内容改变方式,那么如何监听到这种直接赋值引起的 改变呢?这就是下面说的KVC机制。
先给出示例代码: //注册监听 [mTextView addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil]; //处理属性改变事件- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { UITextView *mTextView = object; NSLog("the textView content is change!!");}
对kvo/kvc做了简单的介绍
有些术语描述不够精确请指正。
欢迎讨论。
Kvo是Cocoa的一个重要机制,他提供了观察某一属性变化的方法,极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用的地方非常广泛。(这样的机制听起来类似Notification,但是notification是需要一个发送notification的对象,一般是notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)
适用kvo时,通常遵循如下流程:
1 注册:
keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据(注意这是一个void型)
2 实现变化方法:
change:(NSDictionary *)changecontext:(void*)context
change里存储了一些变化的数据,比如变化前的数据,变化后的数据;如果注册时context不为空,这里context就能接收到。
是不是很简单?kvo的逻辑非常清晰,实现步骤简单。
说了这么多,大家都要跃跃欲试了吧。可是,在此之前,我们还需要了解KVC机制。其实,知道了kvo的逻辑只是帮助你理解而已,要真正掌握的,不在于kvo的实现步骤是什么,而在于KVC,因为只有符合KVC标准的对象才能使用kvo(强烈推荐要使用kvo的人先理解KVC)。
KVC是一种间接访问对象属性(用字符串表征)的机制,而不是直接调用对象的accessor方法或是直接访问成员对象。
key就是确定对象某个值的字符串,它通常和accessor方法或是变量同名,并且必须以小写字母开头。Key path就是以“.”分隔的key,因为属性值也能包含属性。比如我们可以person这样的key,也可以有key.gender这样的key path。
获取属性值时可以通过valueForKey:的方法,设置属性值用setValue:forKey:。与此同时,KVC还对未定义的属性值定义了valueForUndefinedKey:,你可以重载以获取你要的实现(补充下,KVC定义载NSKeyValueCoding的非正式协议里)。
在O-C 2.0引入了property,我们也可以通过.运算符来访问属性。下面直接看个例子:
instance.number = 3;
[instance setValue:[NSNumber numberWithInteger:3]forKey:@"number"];
注意KVC中的value都必须是对象。
以上介绍了通过KVC来获取/设置属性,接下来要说明下实现KVC的访问器方法(accessor method)。Apple给出的惯例通常是:
-key:,以及setKey:(使用的name convention和setter/getter命名一致)。对于未定义的属性可以用setNilValueForKey:。
至此,KVC的基本概念你应该已经掌握了。之所以是基本,因为只涉及到了单值情况,kvc还可以运用到对多关系,这里就不说了,留给各位自我学习的空间
接下来,我们要以集合为例,来对掌握的KVC进行一下实践。
之所以选择array,因为在ios中,array往往做为tableview的数据源,有这样的一种情况:
倘若使用了KVC/kvo,这样的麻烦就迎刃而解了,你将不用关心追加或是更新多少条数据。
下面将以添加数据为例,说明需要实现的方法:
实现insertObject:inKeyAtIndex:或者insertKey:atIndexes。同时在kvo中我们可以通过change这个dictionary得知发生了哪种变化,从而进行相应的处理。
- IPHONE 和 KVC/KVO 监听对象属性变化(例如:获取textView 的text的变化)
- IPHONE 和 KVC/KVO 监听对象属性变化(例如:获取textView 的text的变化)
- KVC/KVO 监听对象属性变化
- KVC 和 KVO 监听容器类(数组等)的变化
- 利用KVO监听属性值的变化
- KVO监听UI控件的frame变化,kVO的简单使用,KVC的初步了解
- javascript 监听对象属性的变化
- dom监听属性的变化
- vue2.0监听数组中对象属性的变化
- KVO: 一个类监听自己的属性(成员变量)的变化
- iOS-监听iPhone本地联系人的变化
- 【iOS】KVO方式监听数组的变化动态刷新tableView
- iOS: 使用KVO监听控制器中数组的变化
- C#:监听类的属性变化
- UIView 监听某一个属性的变化
- 如何监听textview 状态的变化。。。textview被更改的变化
- JS 对象与数组的变化监听
- JS 对象与数组的变化监听
- ogre和havok整合
- 说说"红黑树"
- 企业管理七个顽症
- Android 软件开发之数据的 新建 储存 读取 删除 详解(十四)
- 21.视线:在网格中计算可见性
- IPHONE 和 KVC/KVO 监听对象属性变化(例如:获取textView 的text的变化)
- 查看SQL Server日志 Part 2
- 2012 Multi-University Training Contest 3[hdu4320~4330]
- 22. 走进三维:光线投射法
- 关于ArcEngine的许可级别权限问题
- 更改项目svn用户及密码
- RTP协议详解
- 23. 另一种砖块墙面:纹理映射
- 24.Doomed: Trigonometry in an early first-person shooter game