IOS学习笔记八(KVO)
发布时间:2023-03-30 11:04:53 所属栏目:教程 来源:
导读:KVO介绍KVO机制NSKeyValueObserving协议支持,NS遵循了这个协议 ,所以NSObject的子类都可使用协议中的方法,下面方法可以注册监听添加监听器addObserver: forKeyPath: options: context:删除监听removeObserver: fo
|
KVO介绍KVO机制NSKeyValueObserving协议支持,NS遵循了这个协议 ,所以NSObject的子类都可使用协议中的方法,下面方法可以注册监听添加监听器addObserver: forKeyPath: options: context:删除监听removeObserver: forKeyPath://重写下面的方法,当数据发生变化的时候会回调这个函数-(void)observe... 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 #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) (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
