您的位置:首页 > 移动开发 > IOS开发

iOS中 KVO 键值观察者

2015-10-12 19:06 441 查看
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"];

}
效果展示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: