2017-07-08 109 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