2017-07-08 3 views
3

Ich habe ein NSPopUpButton, die zu einer Unterklasse Objekt gebunden ist, mit den folgenden Methoden überschrieben:Cocoa Bindungen ValueForKey nennen: Statt 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]; 
} 

Die Bindungen sind wie folgt:

  • Inhalt -> Object.availableVoices
  • Inhalt Werte -> Object.availableVoices.name

Statt [Object valueForKeyPath:@"availableVoices.name"] wird aufgerufen, valueForKey: wird für jeden Schlüssel im Schlüsselpfad aufgerufen. availableVoices hat keine Definition für name, so dass es abstürzt.

Soll nicht valueForKey: nach valueForKeyPath: aufgerufen werden, wenn überhaupt?

+0

Es ist eine gute Frage, aber ich frage mich, warum Sie die Inhaltswerte nicht einfach direkt an availableVoiceNames binden. – stevesliva

+0

@stevesliva Wenn der Schlüsselpfad für Inhaltswerte nicht mit dem Schlüsselpfad der Inhaltsbindung beginnt, wird die Inhaltswertbindung ignoriert. – Alex

+1

Beide Bindungen sind zu einer Bindung kombiniert. – Willeke

Antwort

0

Ihr Kommentar schlägt einen Grund für das vor, was Sie sehen. Wenn der "Content" -Pfad ein Präfix der "Content Values" sein muss, ist es sinnvoll, erstere und dann letztere relativ dazu zu machen. Auch wenn Cocoa Bindings KVO verwendet, bedeutet das nicht valueForKeyPath zu verwenden.

Verwandte Themen