使用KVO的要求是對象必須能支持kvc機(jī)制——所有NSObject的子類都支持這個(gè)機(jī)制。
1.一般使用
//添加監(jiān)聽者
[self.tableView addObserver: self forKeyPath: @"frame" options: NSKeyValueObservingOptionNew context: nil];
//監(jiān)聽屬性值發(fā)生,改變時(shí)回調(diào)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
}
2.如果一個(gè)屬性是由其他幾個(gè)屬性決定火惊,如firstName + lastName = fullName液斜。fullName是由firstName和lastName決定的累贤,想要監(jiān)聽fullName的變化叠穆,那么當(dāng)firstName和lastName改動的時(shí)候,該值必須被通知
除了實(shí)現(xiàn)上面的基本方法臼膏,還要實(shí)現(xiàn)下面方法
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"fullName"]) {
NSSet *affectingKeys = [NSSet setWithObjects:@"lastName", @"firstName",nil];
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
}
return keyPaths;
}
個(gè)人理解:在[xxx addObserver: self forKeyPath: @"fullName" options: NSKeyValueObservingOptionNew context: nil];
建立觀察者方法時(shí)候硼被,會調(diào)用+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
方法,將其key擴(kuò)充了
“l(fā)astName”和“firstName”渗磅,所以當(dāng)firstName和lastName都會調(diào)用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
方法