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 valueForKeyPath:@"availableVoices.name"],而是对键路径中的每个键调用 valueForKey:availableVoices 没有 name 的定义,所以它崩溃了。

valueForKey: 是不是应该在 valueForKeyPath: 之后调用,如果有的话?

您的评论说明了您所看到的原因。如果“Content”路径必须是“Content Values”的前缀,那么首先获取前者,然后获取相对于它的后者是有道理的。此外,虽然 Cocoa 绑定使用 KVO,但这并不意味着它 必须 使用 valueForKeyPath.