2009-10-26 5 views
3

Dans mon application, j'ai fait une liaison très simple. J'ai un NSMutableArray lié à un NSArrayController. Le contrôleur lui-même est lié à un ComboBox et il affiche tout le contenu de NSMutableArray. Fonctionne bien.Refresh Cocoa-Binding - NSArrayController - ComboBox

Le problème est: Le contenu du tableau va changer. Si l'utilisateur apporte quelques modifications à l'application, je supprime tous les éléments dans NSMuteableArray et le remplit avec des éléments nouveaux et différents.

Mais la liaison de NSMutableArray -> NSArrayController -> NSComboBox ne s'actualise pas.

Peu importe que je supprime tous les objets du tableau, le ComboBox montre toujours les mêmes éléments.

Quel est le problème ici? Mon approche est-elle incorrecte ou dois-je seulement dire à la liaison de se rafraîchir? Je n'ai pas trouvé comment faire ça.

Répondre

6

Vous êtes susceptible de "modifier la matrice derrière le contrôleur", ce qui perturbe 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 KVC/KVO conforme -monArray/-setMyArray: ensemble d'accesseurs?

Je parie que vous dites directement au "myArray" à -removeAllObjects, non? Comment ces accesseurs KVC/KVO "savent" que le tableau a changé?

La réponse est, ils ne le font pas. Si vous remplacez vraiment l'ensemble du tableau, vous voudrez dire à votre document (ou à celui qui possède le tableau) de -setMyArray: à 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 ne souhaitez remplacer les éléments individuels dans le tableau, vous souhaitez utiliser accesseurs indexées:

(Documentation - voir la section Modèles Collection accesseurs pour à plusieurs propriétés) http://tinyurl.com/yb2zkr5

+3

J'ai résolu le problème avec un Outlet à ArrayController et le message rearrangeObjects. De cette façon, j'ai le tableau mis à jour dans la liste déroulante. – TalkingCode

+0

Bien, je viens de faire la même chose et ça a bien marché pour moi. –

0

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 en utilisant les méthodes d'accès générées. Vous pouvez sinon envoyer des messages KVO sur le tableau mis à jour pour informer les liaisons, que le contenu du tableau a changé.

Christian

1

Essayez ceci (en utilisant ARC/OS X 10.7):

dans le fichier d'en-tête, définissez le arrayInstance et la arrayController

@property (weak) IBOutlet NSArrayController *arrayController; 
@property (strong) NSArray *arrayInstance; // for the array instance 

puis dans la mise en œuvre

@synthesize arrayController = _arrayController; 
@synthesize arrayInstance = _arrayInstance; 

_arrayInstance = ....... // What ever the new array will be 
[_arrayController setContent:_arrayInstance]; 

Cela forcera arrayController à mettre à jour le contenu et à afficher le cor rectement.

Une autre mais 2 ligne de solution de code serait:

[self willChangeValueForKey:@"arrayInstance"]; 
_arrayInstance = ....... // What ever the new array will be 
[self didChangeValueForKey:@"arrayInstance"]; 

pense que la première apparence plus évidente, la deuxième plus KVO semblable.