Cocoa 绑定调用 valueForKey: 而不是 valueForKeyPath:
Cocoa bindings call valueForKey: instead of valueForKeyPath:
我有一个绑定到子类对象的 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
- 内容值 -> Object.availableVoices.name
不是调用 [Object valueForKeyPath:@"availableVoices.name"]
,而是对键路径中的每个键调用 valueForKey:
。 availableVoices
没有 name
的定义,所以它崩溃了。
valueForKey:
是不是应该在 valueForKeyPath:
之后调用,如果有的话?
您的评论说明了您所看到的原因。如果“Content”路径必须是“Content Values”的前缀,那么首先获取前者,然后获取相对于它的后者是有道理的。此外,虽然 Cocoa 绑定使用 KVO,但这并不意味着它 必须 使用 valueForKeyPath
.
我有一个绑定到子类对象的 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
- 内容值 -> Object.availableVoices.name
不是调用 [Object valueForKeyPath:@"availableVoices.name"]
,而是对键路径中的每个键调用 valueForKey:
。 availableVoices
没有 name
的定义,所以它崩溃了。
valueForKey:
是不是应该在 valueForKeyPath:
之后调用,如果有的话?
您的评论说明了您所看到的原因。如果“Content”路径必须是“Content Values”的前缀,那么首先获取前者,然后获取相对于它的后者是有道理的。此外,虽然 Cocoa 绑定使用 KVO,但这并不意味着它 必须 使用 valueForKeyPath
.