KVO 的概述与使用

参考:http://blog.csdn.net/yuquan0821/article/details/6646400/

一,概述

KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。

二,使用方法

系统框架已经支持KVO,所以程序员在使用的时候非常简单。

1. 注册,指定被观察者的属性,

2. 实现回调方法

3. 移除观察(ARC不需要)

三,实例:

当对象的一个属性变化时,会在屏幕上显示出来

如下面的的money字段

@interface Model : NSObject

@property (nonatomic,assign)int money;

@end

注册观察者

[_myModel addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld  context:NULL];

回调实现

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

    _moneyShow.text = [[NSString alloc]initWithFormat:@"%d",_myModel.money ];

}

 

完整代码

#import "ViewController.h"

@interface Model : NSObject
@property (nonatomic,assign)int money;
@end
@interface ViewController ()
{
    UILabel *_moneyShow;
    Model *_myModel;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _moneyShow = [[UILabel alloc]initWithFrame:CGRectMake(300, 100, 100, 100)];
    _moneyShow.backgroundColor = [UIColor blueColor];
    [self.view addSubview:_moneyShow];
    _myModel = [[Model alloc]init];
    _myModel.money = 100;
//    kvo
    [_myModel addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld  context:NULL];
    
    UIButton *btn = [[UIButton alloc]init];
    btn.frame = CGRectMake(100, 100, 100, 100);
    [btn setTitle:@"加钱" forState:UIControlStateNormal];
    btn.backgroundColor = [UIColor redColor];
    [btn addTarget:self action:@selector(addMoney) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    _moneyShow.text = [[NSString alloc]initWithFormat:@"%d",_myModel.money ];
}
- (void)addMoney
{
    _myModel.money += 100;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 

 

 

posted @ 2016-07-02 16:48  知吾猪  阅读(221)  评论(0编辑  收藏  举报