No.1 注意:
- 1,控件的只读属性,无法监听。
- 2,添加观察者后,属性改变才会被监听到。
1, KVO的使用也很简单,就是简单的3步。
1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:
2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
3.取消注册观察removeObserver:forKeyPath:context:
2,举例:UIButton
- (void)viewDidLoad {
btn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
btn.backgroundColor=[UIColor redColor];
[btn setTitle:@"heh" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
/**
* 注意:
*
* (1)调用addObserver方法的为你要监听的控件的对象。
* (2)forKeyPath必须是你要监听的控件的属性名字。
*/
[btn addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
[btn addObserver:self forKeyPath:@"font" options:NSKeyValueObservingOptionNew context:nil];
[super viewDidLoad];
}
/**
参数解释:
@param keyPath btn的属性名
@param object btn
@param change 修改的值,与添加观察者时的NSKeyValueObservingOptionNew/NSKeyValueObservingOptionOld对应
@param context 传nil即可
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"test---%@",object);
// if ([keyPath isEqualToString:@"frame"]) {
NSLog(@"%@",[change valueForKey:NSKeyValueChangeNewKey]);
// }
}
//点击方法中改变btn的frame和font
-(void)click
{
//改变属性frame
i+=100;
CGRect frame=CGRectMake(0, 0, 100, i);
btn.frame=frame;
//改变属性font
btn.font = [UIFont systemFontOfSize:13];
}
网友评论