?KVO :( key - Value - Observer )鍵值觀察者,是觀察者設(shè)計(jì)模式的一種具體實(shí)現(xiàn).
KVO,即:Key-Value Observing潜叛,它提供一種機(jī)制柜去,當(dāng)指定的對(duì)象的屬性被修改后贩据,則對(duì)象就會(huì)接受到通知枣抱。簡(jiǎn)單的說(shuō)就是每次指定的被觀察的對(duì)象的屬性被修改后,KVO就會(huì)自動(dòng)通知相應(yīng)的觀察者了.
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.person= [[Personalloc]init];
NSLog(@"%@",_person.name);
#pragma mark ------使用KVC檢測(cè)person對(duì)象的name屬性值有沒(méi)有發(fā)生變化,當(dāng)它變化時(shí),觀察者會(huì)做出相應(yīng)的操作*(執(zhí)行指定方法)
// 1.注冊(cè)觀察者
[_person ? addObserver:self ? forKeyPath:@"name" ? options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld ? context:@"我觀察的是name屬性"];
}
// 2.實(shí)現(xiàn)指定的方法(回調(diào)方法)
//當(dāng)person的name值發(fā)生變化時(shí),觀察者會(huì)自動(dòng)執(zhí)行這個(gè)方法,這個(gè)方法名是固定的,不可改變
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
NSLog(@"被監(jiān)測(cè)的那個(gè)對(duì)象的屬性所在的路徑:%@",keyPath);
NSLog(@"被觀察者:%@", object);
NSLog(@"屬性所有狀態(tài)下的值:%@", change);
NSLog(@"在注冊(cè)觀察者的時(shí)候,傳過(guò)來(lái)的context :%@", context);
if(![[changeobjectForKey:@"new"]isEqualToString:[changeobjectForKey:@"old"]]) {
self.view.backgroundColor= [UIColorredColor];
}
//4.移除觀察者
[_person ? removeObserver:selfforKeyPath:keyPathcontext:context];
}
- (IBAction)changePersonValue:(UIButton*)sender {
// 3.當(dāng)屬性值發(fā)生變化時(shí)氢烘,將會(huì)觸發(fā)回調(diào)方法
NSLog(@"name值發(fā)生了變化!");
_person.name=_textField.text;
}
@end