您的当前位置:首页正文

KVO监听事件

来源:华拓网

1.什么是KVO

  • KVO == (Key-Value Observing)
  • 当指定的对象中某个指定的属性的值改变的时候,此对象接收到通知的机制;
//我们自定义一个模型类  "Person.h"
//在.h文件中我们可以声明几个属性

@interface Person : NSObject

/** 年龄 */
@property (nonatomic, assign) int age;
/** 成绩 */
@property (nonatomic, assign) int performance;
/**姓名 */
@property (strong, nonatomic) NSString *name;

@end


//随便在一个ViewController里面应用此类
@interface PRFLabelController : UIViewController

/*显示消息的label*/
@property (nonatomic,strong) UILabel *personImformationLabel;
/**被显示的人物对象*/
@property (nonatomic,strong) Person *person;
@end

#import "PRFLabelController.h"
@interface PRFLabelController ()

/**最新的成绩*/
@property (nonatomic,assign) int  newPerformance;
/**更新成绩的按钮*/
@property (strong, nonatomic) UIButton *updateBtn;
@end

//控制器的.m文件
@implementation PRFLabelController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    //初始化模型对象
    self. person = [[Pserson alloc] init];
    self.person.age = 18;  //初始化属性值
    self.person.name = @"prf"; 
    self.person.performaance = 0;

    //指定一个新成绩
    self. newPerformance = 60;
    
    //添加kvo监听
    [self. person addObserver:self forKeyPath:@"performance" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];  //options参数是用于指定在值修改以后,反馈回来的是新值还是旧值
    
    //初始化更新按钮 (不具体写了)
    //self.updateBtn 添加一个 updateperformance 的点击事件
}

//点击按钮时更改对象成绩
-(void) updateperformance{
  
//更新对象的成绩
[self.person setValue:@(self.newperformance) forKey:@"performance"];
//修改新成绩 <这不是必要的>
self.newperformance +=2;
}

//Person对象监听到属性值变化后,自动执行以下方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

NSLog(@"%@",change);//改变的数据(包含该改变前的和改变后的数据)
    //判断修改的属性是否为performance才执行对应的时间
    if([keyPath isEqualToString:@"performance"]){
        //此处写监听到键值内容改变后想要做的对应的事情
    }
}

#pragma mark 控制器销毁的时候记得移除监听
- (void)dealloc{
[self.person removeObserver:self forKeyPath:@"price"];
}
@end