使用KVO的要求是对象必须能支持kvc机制——所有NSObject的子类都支持这个机制。
1.一般使用
//添加监听者
[self.tableView addObserver: self forKeyPath: @"frame" options: NSKeyValueObservingOptionNew context: nil];
//监听属性值发生,改变时回调
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
}
2.如果一个属性是由其他几个属性决定,如firstName + lastName = fullName。fullName是由firstName和lastName决定的,想要监听fullName的变化,那么当firstName和lastName改动的时候,该值必须被通知
除了实现上面的基本方法,还要实现下面方法
+ (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;
}
个人理解:在[xxx addObserver: self forKeyPath: @"fullName" options: NSKeyValueObservingOptionNew context: nil];
建立观察者方法时候,会调用+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
方法,将其key扩充了
“lastName”和“firstName”,所以当firstName和lastName都会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
方法
网友评论