加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

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)
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章