iOS中 KVO 键值观察者
2015-10-12 19:06
441 查看
KVO Key-Value-Obsever 键值观察者
1.首先要有一个观察者,此时被观察者是自己找一个观察者观察自己的key值对应的value值有没有改变,如果改变了就可以做一些响应的操作
创建一个被观察者:
2.给被观察者注册观察者
第一个参数:注册的观察者对象
第二个参数:要观察的key路径
第三个参数:观察value值的变化情况
监听方法:
触发的时机:一旦观察者发现被观察者的name key值对应的value值发生变化的时候就会自动调用这个方法
一般观察的key值对应的value变化时,我们要做的一些操作都写在这个方法中
改变属性值:
移除观察者:
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本地推送-备用
- ios实现截屏(转)
- ios9下照片浏览模糊的解决方法(ALAsset.thumbnail模糊)
- iOS人脸识别核心代码(备用)
- iOS - 屏幕适配-之自动适配
- iOS中的多线程技之Pthread和NSThread
- ios登陆界面
- fir.im Weekly - 给女朋友的 iOS 开发教程
- fir.im Weekly - 给女朋友的 iOS 开发教程
- 项目适配iOS9遇到的一些问题及解决办法(更新两个小问题)
- iOS 开发 是该选择Block 还是Delegate呢
- ios测试基础二:mac 安装并使用git下载代码步骤
- iOS7 新特性 edgesForExtendedLayout
- ios vfl代码布局
- iOS软件开发 快速将p12文件转pem
- ios9 3dtouch 博客
- iOS 这一段时间的感悟
- iOS 导航栏navigation的translucent属性 影响半透明状态
- iOS之错误总结收集
- iOS 各种控件默认高度(图示)