KVO默认关闭
2015-12-05 11:13
316 查看
1.首先创建Person类,有两个属性 name 和 sex
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *sex;
2.在viewController中声明person的属性,并给person类的两个属性添加观察者
代码如下#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property(nonatomic,strong)Person *person;
@end
@implementation ViewController
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.person.name=@"sssss";
self.person.sex=@"dddd";
self.person.name=@"sssss";
}
- (void)viewDidLoad {
[super viewDidLoad];
self.person=[Person new];
self.person.name=@"asd";
self.person.sex=@"qweq";
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:@"person"];
[self.person addObserver:self forKeyPath:@"sex" options:NSKeyValueObservingOptionNew context:@"person"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%@",keyPath);
}
3.在person.m文件中重写两个方法,前者为关闭默认实现,后者监听变化
#import "Person.h"
@implementation Person
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
if ([key isEqualToString:@"name"]) {
return NO;
}else{
return [super automaticallyNotifiesObserversForKey:key];
}
}
-(void)setName:(NSString *)name{
if (_name!=name) {
[self willChangeValueForKey:@"name"];
_name=name;
[self didChangeValueForKey:@"name"];
}
}
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *sex;
2.在viewController中声明person的属性,并给person类的两个属性添加观察者
代码如下#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property(nonatomic,strong)Person *person;
@end
@implementation ViewController
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.person.name=@"sssss";
self.person.sex=@"dddd";
self.person.name=@"sssss";
}
- (void)viewDidLoad {
[super viewDidLoad];
self.person=[Person new];
self.person.name=@"asd";
self.person.sex=@"qweq";
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:@"person"];
[self.person addObserver:self forKeyPath:@"sex" options:NSKeyValueObservingOptionNew context:@"person"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%@",keyPath);
}
3.在person.m文件中重写两个方法,前者为关闭默认实现,后者监听变化
#import "Person.h"
@implementation Person
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
if ([key isEqualToString:@"name"]) {
return NO;
}else{
return [super automaticallyNotifiesObserversForKey:key];
}
}
-(void)setName:(NSString *)name{
if (_name!=name) {
[self willChangeValueForKey:@"name"];
_name=name;
[self didChangeValueForKey:@"name"];
}
}
相关文章推荐
- OpenCV中图像指针注意点
- JQ 为未来元素添加事件处理器—事件委托
- OC 继承子类对象调用方法机制 子类对象访问父类中的实例变量
- Memory used by a single oracle server process
- 关于Action返回结果类型的事儿(下)
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
- Ubuntu14.04 安装配置Hadoop2.6.0
- 算法笔记 选择排序
- JAVA通信编程(二)——如何读取java的properties配置文件(插播)
- 操作系统---基础题目汇总四
- mysql时间拼接
- JAVA通信编程(二)——如何读取java的properties配置文件(插播)
- View的事件体系
- Linux搭建NFS提供磁盘给Windows使用
- sqlserver 分页查询总结
- Python 列表(Lists)
- VC多线程编程(转载)http://www.cnblogs.com/xmsnzs/articles/1267436.html
- 怎么在ubuntu麒麟版上安装谷歌浏览器chorme 的 flash 来看电影(简单且直接的方法)
- Codeforces Round #334 (Div. 2) B. More Cowbell