Cocoa绑定调用valueForKey:代替valueForKeyPath:
问题描述:
我已经被绑定到一个子类对象时,用下面的方法的一个NSPopUpButton覆盖:Cocoa绑定调用valueForKey:代替valueForKeyPath:
- (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:
之后调用?
答
您的评论为您提供了一个理由。如果“内容”路径必须是“内容值”的前缀,那么首先获取前者,然后相对于后者获得一定意义。虽然可可绑定使用KVO,但并不意味着它有使用valueForKeyPath
。
这是一个很好的问题,但我不知道为什么你不直接将内容值绑定到availableVoiceNames。 – stevesliva
@stevesliva如果内容值键值路径不是以内容绑定的键路径开始,则内容值绑定将被忽略。 – Alex
两种绑定都合并为一种绑定。 – Willeke