KVC、KVO

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];
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容