ios - kvo观察者示例
2024-08-27 00:16:08
- 首先创建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
- 注意点:
- 为某个对象的某个属性添加观察者,最后一定要移除,否则可能会崩溃
- 实现方法-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context则只要监听的属性发生改变就会触发.
最新文章
- SQL 使用小记
- 解决img标签间距问题
- javascript画直线和画圆的方法(非HTML5的方法)
- 【原】Windows下常用命令
- html注意
- mysql 批量更新与批量更新多条记录的不同值实现方法
- mongo中查询Array类型的字段中元素个数
- Beyond Compare 使用介绍
- XPath总结一
- strcat()的编写
- 块对象block小结
- 【ASP.NET Core】运行原理[3]:认证
- IOC 控制反转(Inversion of Control,英文缩写为IoC)
- 【Linux命令】ps命令
- python之函数联系
- 5、Kafka生产过程分析
- NFS配置与安装
- JustOj 1486: Hello, world!
- Json中不支持任何形式的注释,那我们要怎么解决呢
- mcu 通信数据解析
热门文章
- IDF实验室:牛刀小试
- win10休眠选项在哪里设置?如何设置?
- dedecms在首页或列表调取文章内容body的三个方法
- CentOS 6.5 下 CDH 5.2.1 集群安装(一)
- 【BZOJ1076】[SCOI2008]奖励关 状压DP+期望
- cocos2d-x初步了解
- C#自定义控件属性显示在属性面板中操作
- vim_cfg
- Android 之 ListView的学习
- [转]Oracle Hidden Parameter:_allow_resetlogs_corruption