我有一个绑定到子类化对象的NSPopUpButton,覆盖了以下方法:
- (id)valueForKeyPath:(NSString *)keyPath {
NSLog(@"valueForKeyPath: %@", keyPath);
if ([keyPath hasSuffix:@"availableVoices.name"]) {
return self.availableVoiceNames;
} else {
return [super valueForKeyPath:keyPath];
}
}
- (id)valueForKey:(NSString *)key {
NSLog(@"valueForKey: %@", key);
return [super valueForKey:key];
}
绑定如下所示:
- 内容 -> 对象可用语音
- 内容价值 -> Object.availableVoices.name
不是调用[Object valueForKeyPath:@"availableVoices.name"]
,而是在密钥路径中的每个密钥上调用valueForKey:
。availableVoices
没有name
的定义,因此它会崩溃。
valueForKey:
不应该在valueForKeyPath:
之后被称为,如果有的话?
您的评论表明了您所看到的内容的原因。如果"内容"路径必须是"内容值"路径的前缀,那么首先获取前者,然后获取相对于它的后者是有意义的。此外,尽管Cocoa Bindings使用KVO,但这并不意味着它必须使用valueForKeyPath
。