KVC、KVO

作者: 思念那年慕云 | 来源:发表于2017-11-19 10:59 被阅读10次

    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];
    }
    

    相关文章

      网友评论

          本文标题:KVC、KVO

          本文链接:https://www.haomeiwen.com/subject/dqkyvxtx.html