iOS中 KVO 键值观察者
KVO Key-Value-Obsever 键值观察者
1.首先要有一个观察者,此时被观察者是自己找一个观察者观察自己的key值对应的value值有没有改变,如果改变了就可以做一些响应的操作
创建一个被观察者:
self.person = [[Person alloc]init];
2.给被观察者注册观察者
NSKeyValueObservingOptionNew 当重新给被观察者的key值赋值时,触发监听方法,此时打印的 change 永远都是最新的值 存放的是value值 NSKeyValueObservingOptionOld 当重新给被观察者的key值赋值时,触发监听方法,此时打印的 change 永远都是上一次的旧值 存放的是value值 NSKeyValueObservingOptionInitial 当初始化被观察者对象或者重新给观察者对象赋值的时,此时走监听方法 NSKeyValueObservingOptionPrior 当被观察者的name属性赋值前后都会触发,notificationIsPrior = 1 标识赋值前后触发
第一个参数:注册的观察者对象
第二个参数:要观察的key路径
第三个参数:观察value值的变化情况
[self.person addObserver:self forKeyPath:@"name" options:(NSKeyValueObservingOptionOld) context:nil]; self.person.name = @"guoMeiMei";
监听方法:
触发的时机:一旦观察者发现被观察者的name key值对应的value值发生变化的时候就会自动调用这个方法
一般观察的key值对应的value变化时,我们要做的一些操作都写在这个方法中
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ NSLog(@"%@",keyPath); NSLog(@"%@",object); NSLog(@"%@",change); //一旦key值对应的value改变,就修改value的背景颜色 self.view.backgroundColor = [UIColor colorWithRed:kColorValue green: kColorValue blue: kColorValue alpha: 0.5]; }
Person类:
Person.h @interface Person : NSObject @property(nonatomic,copy)NSString *name;//名字 @property(nonatomic,copy)NSString *gender;//性别 @property(nonatomic,assign)NSInteger age;//年龄 @end Person.m @implementation Person - (void)dealloc{ self.name = nil; self.gender = nil; [super dealloc]; } - (void)setValue:(id)value forUndefinedKey:(NSString *)key{ } - (NSString *)description{ return [NSString stringWithFormat:@"姓名:%@ 性别:%@ 年龄 %ld",_name,_gender,_age]; } @end
改变属性值:
- (IBAction)setValue:(UIButton *)sender { // NSLog(@"改变属性值"); //name属性的新值 self.person.name = @"liangChen"; }
移除观察者:
- (IBAction)removeOberver:(UIButton *)sender { // NSLog(@"移除观察者"); //观察完成之后要移除观察者,观察者只能被移除一次,第二次就会Crash [self.person removeObserver:self forKeyPath:@"name"]; }
效果展示:
iOS中 KVO 键值观察者的更多相关文章
- KVO 键值观察者
KVO(键值观察者) //监听的创建 -(id)initChildren:(Person *)person { self = [super init]; if (self != nil) { //拥有 ...
- IOS中KVO模式的解析与应用
IOS中KVO模式的解析与应用 最近老翁在项目中多处用到了KVO,深感这种模式的好处.现总结如下: 一.概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修 ...
- KVO键值监听
KVO 键值监听:当我想知道一个对象的属性是否发生改变的时候 做出响应,就需要添加监听keypath 和 key的区别keypath会自动寻找子类的属性key只会寻找当前类的属性添加键值监听[pers ...
- 使用KVO键值监听
本文章从五个方面介绍KVO(Key-Value-Observer)键值观察者: (1)功能介绍 (2)使用步骤 (3)应用场景 (4)原理理解 (5)相关的面试题 一 功能介绍 KVO是OC语言对「观 ...
- 在C#中用Linq从属性文件中读取键值对Key-Value Pair
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中用Linq从属性文件中读取键值对Key-Value Pair.
- C语言定义从URL中获取键值的接口
环境:centos7下,对客户端http请求进行解析,来获取有效键值(包括汉字). 头文件 /* 这是一份关于从Http请求信息中提取键值的接口声明的头文件 */ #ifndef _HEAD_H_ # ...
- js中以键值对的形式当枚举
js中以键值对的形式当枚举var Penum= { B: "姓名", C: "所属居委", D: "证件号", E: "性别&qu ...
- PHP如何根据数组中的键值进行排序
主要是使用PHP的排序函数,asort()和arsort(). 为了减少代码的耦合性,我们将根据数组中的键值进行排序封装成一个函数 <?php $array = array( array(), ...
- Redis中的键值过期操作
1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...
随机推荐
- Lucene——Field.Store(存储域选项)及Field.Index(索引选项)
Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...
- CRM客户关系管理系统(三)
第四章.kingadmin开发设计 4.1.kingadmin设计 自定义admin注册model的写法 crm/admin.py class CustomerAdmin(admin.ModelAdm ...
- Java面试16|设计模式
1.单例模式: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下几个要素: 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 单例模式根 ...
- eclipse中启动tomcat,localhost:8080无法访问
问题 eclipse中启动tomcat,项目可以正常运行,但是localhost:8080无法访问. 关闭eclipse中的Tomact,直接从tomcat/bin 下的startup.bat启动,l ...
- Protobuf3语法详解
定义一个消息类型 先来看一个非常简单的例子.假设你想定义一个"搜索请求"的消息格式,每一个请求含有一个查询字符串.你感兴趣的查询结果所在的页数,以及每一页多少条查询结果.可以采用如 ...
- 数学API Math.atan() 和Math.atan2() 三角函数复习
今天在学习贝塞尔曲线看到需要结合三角函数 以及两个不认识的Api :API Math.atan() 和Math.atan2() 先看下三角函数 正切函数图:(180为一个周期 即45=45+180) ...
- dynamic initializer和全局变量
"慎用全局变量,包括全局静态变量" 是众所周知的原则,因为全局变量除了会增加程序的维护成本. 如果全局变量是个复杂的对象,并且还使用其他的全局变量,那情况就变得复杂的多.因为全局变 ...
- Sencha EXTJS6的 Eclipse 插件安装指南
Sencha EXTJS的 Eclipse 插件安装指南 (翻译:苏生米沿) 本文地址:http://blog.csdn.net/sushengmiyan/article/details/52566 ...
- Android反编译(未混淆的apk)
Android反编译(未混淆的apk) 工具 dex2jar 下载地址:我的CSDN 或者 官网 jd-gui 下载地址:我的CSDN 或者 官网 反编译步骤 1. 将APK解压缩,获取classes ...
- Dynamics CRM2016 Web API之获取查找字段的text及选项集的text
本篇再来介绍个web api的功能,关于lookup的text这里只是略带,因为有expand,现有的web api就能实现,主要提的是选项集的text,我们通过基本的查询api查出来的字段值只带有v ...