Mon interface utilisateur ne se met pas à jour lorsque je le souhaite. L'application affiche "projets" en utilisant une vue similaire à iTunes - une liste de sources sur la gauche vous permet de filtrer une liste (NSTableView) sur la droite. Mes filtres se mettent à jour correctement lorsqu'ils examinent un champ simple (comme un nom, une chaîne), mais pas pour des tableaux (comme des balises). Je supprime une balise d'un de mes objets (à partir d'un champ NSMutableArray appelé "balises") et je m'attends à ce qu'elle disparaisse de la liste car elle ne correspond plus au prédicat lié à NSArrayController de ma table.en utilisant KVO pour mettre à jour un NSTableView filtré par un NSPredicate
ProjectBrowser.mm:
self.filter = [NSPredicate predicateWithFormat:@"%@ IN %K",
selectedTag,
@"tags"];
Project.mm:
[self willChangeValueForKey:@"tags"];
[tags removeAllObjects];
[self didChangeValueForKey:@"tags"];
J'ai aussi essayé, mais le résultat est le même:
[[self mutableArrayValueForKey:@"tags"] removeAllObjects];
configuration Interface Builder :
- un objet ProjectBrowser est a son tableau de contenu lié à « du propriétaire du fichier » .projects
- le prédicat de filtre de contrôleur du projet est lié à « propriétaire du fichier » .filter
- du fichier Propriétaire
- un NSArrayController (Project Controller) le XIB La colonne NSTableView est liée à "Project Controller" .name
Merci d'avoir signalé l'erreur de syntaxe, elle s'est produite lors de ma tentative d'extraction du code pertinent. Je l'ai corrigé ci-dessus. – KingRufus
Je n'observe pas les balises, mais le prédicat semble observer des champs simples en cas de besoin. Ce filtre met à jour la liste chaque fois que le nom change: [.. predicateWithFormat: @ "% K ==% @", @ "name", selectedName] Donc si je ne propage pas la notification de changement, malgré mes efforts, comment Je répare ça? La capacité de KVO à observer en utilisant des keypaths comme "project.someObject.someField" me porte à croire que ces changements devraient "remonter" à un observateur sans exiger de code de colle à chaque lien dans la chaîne/le chemin. Actuellement, les tableaux cassent n'importe quelle chaîne dans la fonctionnalité d'observation keypath de mon code. – KingRufus
Une autre supposition: il se peut que le prédicat optimise votre changement parce que vous ne changez pas l'objet de tags lui-même. Essayez '[release tags]; tags = [[NSMutableArray alloc] init]; 'au lieu de' [tags removeAllObjects] ' – JeremyP