IOS學(xué)習(xí)筆記八(KVO)
1、KVO介紹
KVO機(jī)制NSKeyValueObserving協(xié)議支持,NS遵循了這個(gè)協(xié)議 ,所以NSObject的子類都可使用協(xié)議中的方法,下面方法可以注冊(cè)監(jiān)聽
添加監(jiān)聽器
addObserver: forKeyPath: options: context:
刪除監(jiān)聽
removeObserver: forKeyPath:
//重寫下面的方法,當(dāng)數(shù)據(jù)發(fā)生變化的時(shí)候會(huì)回調(diào)這個(gè)函數(shù)
-(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物品名為:%@,物品價(jià)格為:%d", self.item.name, self.item.price);
}
//自定義設(shè)置item
-(void)setItem:(FKItem *)item
{
self->_item = item;
// self.item = item;
//為item添加監(jiān)聽器,監(jiān)聽item的name屬性的改變
[self.item addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
[self.item addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionInitial context:nil];
}
//重寫方法,當(dāng)監(jiān)聽的數(shù)據(jù)模型發(fā)生改變時(shí)候,就會(huì)回調(diào)這個(gè)方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
NSLog(@"observeValueForKeyPath方法被調(diào)用了");
NSLog(@"被修改的keyPath為:%@", keyPath);
NSLog(@"被修改的對(duì)象為:%@", 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、運(yùn)行結(jié)果
observeValueForKeyPath方法被調(diào)用了
被修改的keyPath為:name
被修改的對(duì)象為:<FKItem: 0x600000035360>
新被修改的屬性值為:chencaifeng
被修改的上下文為:(null)
observeValueForKeyPath方法被調(diào)用了
被修改的keyPath為:price
被修改的對(duì)象為:<FKItem: 0x600000035360>
新被修改的屬性值為:(null)
被修改的上下文為:(null)
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)