2017-07-08 3 views
3

J'ai un NSPopUpButton qui est lié à un objet sous-classé, avec les méthodes suivantes écrasées:liaisons Cocoa appellent valueForKey: au lieu de 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]; 
} 

Les liaisons sont les suivantes:

  • Contenu -> Object.availableVoices
  • Valeurs de contenu -> Object.availableVoices.name

Au lieu de [Object valueForKeyPath:@"availableVoices.name"] étant appelé, valueForKey: est appelé sur chaque clé dans le chemin d'accès clé. availableVoices n'a pas de définition pour name alors il plante.

N'est-ce pas valueForKey: est censé être appelé après valueForKeyPath:, voire pas du tout?

+0

C'est une bonne question, mais je me demande pourquoi vous ne liez pas directement les valeurs de contenu à availableVoiceNames. – stevesliva

+0

@stevesliva Si le chemin de clé Valeurs de contenu ne démarre pas avec le chemin de clé de la liaison de contenu, la liaison Valeurs de contenu n'est pas prise en compte. – Alex

+1

Les deux liaisons sont combinées à une liaison. – Willeke

Répondre

0

Votre commentaire suggère une raison pour ce que vous voyez. Si le chemin "Contenu" doit être un préfixe des "Valeurs du contenu", alors il faut d'abord obtenir le premier, puis le dernier par rapport à celui-ci. Même si Cocoa Bindings utilise KVO, cela ne signifie pas que a pour utiliser valueForKeyPath.