2017-07-08 79 views
3

我已经被绑定到一个子类对象时,用下面的方法的一个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:之后调用?

+0

这是一个很好的问题,但我不知道为什么你不直接将内容值绑定到availableVoiceNames。 – stevesliva

+0

@stevesliva如果内容值键值路径不是以内容绑定的键路径开始,则内容值绑定将被忽略。 – Alex

+1

两种绑定都合并为一种绑定。 – Willeke

回答

0

您的评论为您提供了一个理由。如果“内容”路径必须是“内容值”的前缀,那么首先获取前者,然后相对于后者获得一定意义。虽然可可绑定使用KVO,但并不意味着它使用valueForKeyPath