Refresh Cocoa-Binding - NSArrayController - ComboBox
-
06-07-2019 - |
Question
dans ma candidature, j’ai fait une liaison très simple. J'ai un NSMutableArray lié à un NSArrayController. Le contrôleur lui-même est lié à une zone de liste déroulante et affiche tout le contenu de NSMutableArray. Fonctionne bien.
Le problème est le suivant: le contenu du tableau changera. Si l'utilisateur apporte des modifications à l'application, je supprime tous les éléments de NSMuteableArray et le remplis d'éléments nouveaux et différents.
Mais la liaison de NSMutableArray < - > NSArrayController & Lt; - & Gt; NSComboBox ne s'actualise pas.
Peu importe si je supprime tous les objets du tableau, la ComboBox affiche toujours les mêmes éléments.
Qu'est-ce qui ne va pas ici? Est-ce que mon approche est mauvaise ou dois-je seulement dire à la reliure de se rafraîchir? Je n'ai pas trouvé comment faire cela.
La solution
Vous êtes probablement & "; modifiez le tableau derrière le dos du contrôleur &" ;, ce qui subvertit le mécanisme KVO.
Vous avez dit:
J'ai un NSMutableArray lié à un NSArrayController.
Comment? Où vit le tableau? Dans un document, accessible via un fichier -myArray / -setMyArray: ensemble d’accesseurs? Compatible KVC / KVO?
Je parie que vous dites directement le & "myArray &"; ivar to -removeAllObjects, non? Comment ces accesseurs KVC / KVO & "Sauront-ils &"; le tableau a changé?
La réponse est non. Si vous remplacez réellement le tableau entier, vous voudrez dire à votre document (ou à quiconque possède le tableau) de -setMyArray: vers un tout nouveau tableau. Cela déclenchera les appels KVO appropriés.
... mais alors, vous n'avez pas vraiment besoin d'un tableau mutable, n'est-ce pas? Si vous souhaitez uniquement remplacer des éléments individuels dans le tableau, vous devrez utiliser des accesseurs indexés:
(Documentation - voir la section Modèles d'accès de collection pour des propriétés multiples) http://tinyurl.com/yb2zkr5
Autres conseils
Essayez ceci (avec ARC / OS X 10.7):
dans le fichier d'en-tête, définissez arrayInstance et arrayController
@property (weak) IBOutlet NSArrayController *arrayController;
@property (strong) NSArray *arrayInstance; // for the array instance
puis en mise en œuvre
@synthesize arrayController = _arrayController;
@synthesize arrayInstance = _arrayInstance;
_arrayInstance = ....... // What ever the new array will be
[_arrayController setContent:_arrayInstance];
Ceci forcera le arrayController à mettre à jour le contenu et à s'afficher correctement.
Une autre solution de code mais 2 lignes serait:
[self willChangeValueForKey:@"arrayInstance"];
_arrayInstance = ....... // What ever the new array will be
[self didChangeValueForKey:@"arrayInstance"];
Pensez que le premier semble plus évident, le second plus semblable au KVO.
La conformité KVC / KVO semble être le problème. Vous devez créer le nouveau tableau et mettre à jour la référence avec le nouvel objet à l'aide des méthodes d'accesseur générées. Sinon, vous pouvez déclencher des messages KVO sur le tableau en cours de mise à jour pour informer les liaisons que le contenu du tableau a changé.
Chrétien