KVO监听属性变化

  • 首先创建Person分类

#import <Foundation/Foundation.h>

@interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) float height; @end 
  • .m中不做任何事情

  • 控制器.m中


#import "ViewController.h"
#import "Person.h"
@interface ViewController () @property (nonatomic, strong) Person *per; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; Person * per = [Person new]; per.name = @"zhangsan"; per.height = 1.2; self.per = per; // kvo 为per.name添加观察者 [per addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; // kvo 为per.height添加观察者 [per addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; } 
  • 只要监听的属性name 和 height的值发生了改变就会触发下面的方法

/** 添加观察者必须要实现的方法 */
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ /** 打印新老值 */ // 从打印结果看 分别打印出了 name 与 height的新老值 NSLog(@"old : %@ new : %@",[change objectForKey:@"old"],[change objectForKey:@"new"]); // NSLog(@"keypath : %@",keyPath); // NSLog(@"change : %@",change); } 
  • 由于对person.name 以及height的属性都做了监听,只要触摸后属性的值发生改变就做得到通知触发通知方法 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context 则可以在其内部做你想要做的事

/** 触摸改变per.name属性值 */
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ self.per.name = @"helloworld"; self.per.height = 3.3; } 
  • 一定要记得移除


/** 移除 */
-(void)dealloc{

    [self.per removeObserver:self forKeyPath:@"name" context:nil]; [self.per removeObserver:self forKeyPath:@"height" context:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 
  • 注意点:
    1. 为某个对象的某个属性添加观察者,最后一定要移除,否则可能会崩溃
    1. 实现方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context则只要监听的属性发生改变就会触发.
 

转载于:https://www.cnblogs.com/holyday/p/8250118.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值