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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top