Cocoa绑定调用valueForKey:而不是valueForKeyPath:

时间:2017-07-08 17:11:22

标签: objective-c xcode cocoa interface-builder cocoa-bindings

我有一个绑定到子类对象的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:之后被调用,如果有的话?

1 个答案:

答案 0 :(得分:0)

您的评论表明了您所看到的原因。如果“内容”路径必须是“内容值”的前缀,那么首先获得前者然后相对于它的后者是有道理的。尽管Cocoa Bindings使用KVO并不意味着 使用valueForKeyPath