key - value - observer 觀察者觀察的是屬性是否執(zhí)行了setter方法鬼癣、或者是否使用了KVC賦值,只要有賦值的動(dòng)作就會(huì)執(zhí)行KVO的回調(diào)方法啤贩。如果賦值沒有通過setter方法或者KVC待秃,例如:_name = @"新值",這時(shí)不會(huì)觸發(fā)kvo的回調(diào)方法
- KVO的使用可以分為兩步
1.注冊(cè)觀察者
2.在回調(diào)方法中監(jiān)聽被觀察者屬性的變化- 注冊(cè)觀察者
//第一個(gè)參數(shù)observer:觀察者 (這里觀察self.view對(duì)象的屬性的變化)
//第二個(gè)參數(shù)keyPath:被觀察的屬性名稱(這里觀察self.view背景顏色的改變)
//第三個(gè)參數(shù)options:觀察屬性的新值痹屹、舊值等的一些配置(枚舉值章郁,這里用來監(jiān)聽改變時(shí)的新值)
//第四個(gè)參數(shù)context:上下文,可以為kvo的回調(diào)方法傳值
//注冊(cè)觀察者
[self.view addObserver:self forKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew context:nil];
- 在回調(diào)方法中監(jiān)聽被觀察者屬性的變化(當(dāng)self.view的backgroundColor在某處發(fā)生改變則會(huì)自動(dòng)調(diào)用該方法)
//參數(shù)解釋
//keyPath:屬性名稱
//object:被觀察的對(duì)象
//change:變化前后的值都存儲(chǔ)在change字典中(因?yàn)樯厦娌贾糜^察新值)
//context:注冊(cè)觀察者時(shí)志衍,context傳過來的值
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if([keyPath isEqualToString:@"backgroundColor"]){//View的背景顏色發(fā)生了變化
//newColor為改變后的值
id newColor = [change objectForKey:NSKeyValueChangeNewKey]
}
}