1、KVO介绍
KVO机制NSkeyvalueObserving协议支持,NS遵循了这个协议 ,所以NSObject的子类都可使用协议中的方法,下面方法可以注册监听
添加监听器
addobserver: forKeyPath: options: context:
删除监听
removeObserver: forKeyPath:
-(void)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(id)object change:(NSDictionary<NSkeyvalueChangeKey,id> *)change context:(void *)context
2、测试代码
FKItemView.h
#ifndef FKItemView_h
#define FKItemView_h
#import <Foundation/Foundation.h>
#import "FKItem.h"
@interface FKItemView : NSObject
@property (nonatomic,weak) FKItem *item;
-(void)showItemInfo;
@end
#endif /* FKItemView_h */
FKItemView.m
#import <Foundation/Foundation.h>
#import "FKItemView.h"
@implementation FKItemView
@synthesize item = _item;
-(void)showItemInfo
{
NSLog(@"item物品名为:%@,物品价格为:%d",self.item.name,self.item.price);
}
//自定义设置item
-(void)setItem:(FKItem *)item
{
self->_item = item;
// self.item = item;
//为item添加监听器,监听item的name属性的改变
[self.item addobserver:self forKeyPath:@"name" options:NSkeyvalueObservingOptionNew context:nil];
[self.item addobserver:self forKeyPath:@"price" options:NSkeyvalueObservingOptionInitial context:nil];
}
//重写方法,当监听的数据模型发生改变时候,就会回调这个方法
-(void)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(id)object change:(NSDictionary<NSkeyvalueChangeKey,id> *)change context:(void *)context
{
NSLog(@"observeValueForKeyPath方法被调用了");
NSLog(@"被修改的keyPath为:%@",keyPath);
NSLog(@"被修改的对象为:%@",object);
NSLog(@"新被修改的属性值为:%@",[change objectForKey:@"new"]);
NSLog(@"被修改的上下文为:%@",context);
}
-(void)dealloc
{
[self.item removeObserver:self forKeyPath:@"name"];
[self.item removeObserver:self forKeyPath:@"price"];
}
@end
main.m
#import "FKItemView.h"
int main(int argc,char * argv[]) {
@autoreleasepool {
FKItemView *itemView = [FKItemView new];
FKItem *item = [FKItem new];
itemView.item = item;
[itemView showItemInfo];
item.name = @"chencaifeng";
item.price = 79;
}
}
3、运行结果
observeValueForKeyPath方法被调用了
被修改的keyPath为:name
被修改的对象为:<FKItem: 0x600000035360>
新被修改的属性值为:chencaifeng
被修改的上下文为:(null)
observeValueForKeyPath方法被调用了
被修改的keyPath为:price
被修改的对象为:<FKItem: 0x600000035360>
新被修改的属性值为:(null)
被修改的上下文为:(null)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。