2017-02-17 2 views
0

J'ai un NSArrayController (itemsController) qui contient un tableau de MyObject. Ce contrôleur est lié à un NSTableView qui a plusieurs colonnes, toutes liées à des propriétés différentes. Je veux observer l'une de ces propriétés ailleurs dans l'application.observeValueForKeyPath: appelé pour chaque propriété, pas seulement la propriété observée

[[self itemsController] addObserver:self forKeyPath:@"selectedObjects.someProperty" options:NSKeyValueObservingOptionNew context:nil]; 

Dans le rappel:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

Je reçois appelé chaque fois que la propriété dans les changements de sélection, mais je veux seulement être appelée quand someProperty change dans un objet sélectionné.

Comment puis-je empêcher tous ces autres appels lorsque rien n'a vraiment changé?

L'observation de @ "selection.someProperty" a le même résultat.

+0

Je trouve cela difficile à croire. Il n'y a aucun moyen d'observer * toutes * les propriétés d'un objet. Comment changez-vous les propriétés? Quel dictionnaire 'keyPath' et' change's recevez-vous? Est-ce que vous appelez explicitement '-will/didChangeValueForKey:' ou des méthodes similaires? Substituez-vous les méthodes KVC ou KVO (par exemple '-setValue: forKey:')? Le contrôleur RAID effectue-t-il un filtrage ou un tri? Est-ce que 'automaticallyRearrangesObjects' est activé? Au fait, il n'y a pas de doute: vous devriez être lié par 'selection' et ** not **' selectedObjects'. –

Répondre

1

Vous êtes également averti lorsque les modifications selectedObjects ou selection. Si vous voulez être averti quand someProperty change alors vous devez observer someProperty des objets sélectionnés et enlever et ajouter des observateurs quand la sélection change.

Les superclasses de votre classe d'observation pourraient également être observées. Utilisez le paramètre context pour reconnaître vos notifications. Voir Best practices for context parameter in addObserver (KVO)