3

Je rencontre des problèmes lors de l'affichage du contenu d'un NSArrayController dans deux fenêtres définies dans différents XIB.Utilisation d'un contrôleur NSArrayController à partir de plusieurs XIB

Dans ma fenêtre principale (en MainMenu.xib), j'ai un NSTableView qui est lié à un NSArrayController

Dans mon deuxième XIB, j'avoir une autre fenêtre qui contient un NSTableView. J'ai créé un nouveau NSArrayController et lié la table au contenu de ce NSArrayController.

Les deux NSArrayControllers sont liés au même NSArray. Tout va bien au début, mais le problème est que si un objet est ajouté au tableau en utilisant NSArrayController dans la fenêtre principale, la vue de la fenêtre secondaire des données n'est pas mise à jour. Cela est probablement dû au fait qu'il ne sait pas qu'il doit se mettre à jour, car NSArrayController n'a pas été utilisé pour ajouter le nouvel objet.

Ce que je voudrais faire est d'utiliser exactement la même instance de NSArrayController dans les deux fenêtres. De cette façon, si un objet est ajouté au tableau, les deux vues seront notifiées du changement.

Le problème est que je n'arrive pas à comprendre comment faire cela dans Interface Builder. Je ne peux pas lier un NSArrayController à un autre NSArrayController (j'obtiens une erreur d'exécution indiquant qu'il ne peut être lié qu'à un NSArray). La connexion de NSArrayController au membre NSArrayController du propriétaire du fichier n'aidera pas non plus, car cela effacera simplement le NSArrayController que je veux qu'il utilise.

Je suppose que je pourrais définir les liaisons moi-même dans le code, mais il semble qu'il serait préférable d'utiliser Interface Builder si possible. Y a-t-il un moyen de le faire dans Interface Builder, ou peut-être une meilleure façon de tout configurer ensemble?

Mise à jour: En réponse à la réponse de Chuck et les commentaires, j'ai essayé les éléments suivants: liØes le tableau Contenu de mon NSTableView aux arrangedObjects du membre NSArrayController (si je le NSArrayController lui-même, une erreur est apparu dans la log: « [NSArrayController compte]: sélecteur non reconnu envoyé à l'instance ») liØes chaque colonne de la table, avec un modèle de fichier propriétaire chemin clé de arrayController.arrangedObjects.propertyName

Ce encore n'a pas entraîné le contenu de la table recevant des mises à jour. Je pense que cela est dû au fait que je suis lié aux objets orderedObjects de NSArrayController, plutôt qu'à NSArrayController lui-même. Mais, si je me lie directement au NSArrayController, cela me donne des erreurs.

Normalement, je sélectionnais mon NSArrayController à partir de la zone de liste déroulante "Lier à", j'utilise arrangedObjects comme clé de contrôleur et la propriété elle-même comme chemin de clé de modèle. Je ne sais pas comment faire l'équivalent dans ce cas - si je peux.

Ai-je fait quelque chose de mal dans le processus ci-dessus?

+0

Peut-être que quelqu'un pourrait corriger le titre de cette question, je pense que 'de' doit être 'pour'. –

Répondre

1

La meilleure option que j'ai été capable de proposer est d'aviser le deuxième que le tableau qu'il gère a changé en appelant rearrangeObjects: dessus.Cela semble maladroit, mais cela fonctionne.

0

Il n'y a aucune raison pour laquelle deux contrôleurs RAID ne doivent pas mettre à jour une vue lorsque vous la mettez à jour via une autre. Si ce n'est pas le cas, il semble que vos notifications KVO se perdent quelque part. Il est fort probable que vous modifiez directement un tableau (dans la méthode add: d'une sous-classe de NSArrayController) sans envoyer les notifications de modification appropriées.

+0

Comment je fais ça, exactement? Je ne peux pas lier un NSArrayController dans le deuxième XIB à celui dans le propriétaire du fichier, car NSArrayControllers ne peut être lié à NSArrays. Que dois-je utiliser pour le chemin dans mon NSTableView pour extraire les données de ce NSArrayController? – Andy

+0

C'est juste un code-clé normal. Supposons que le propriétaire de votre fichier stocke une référence au contrôleur sous la forme 'arrayController'. Vous lieriez la vue table au propriétaire du fichier avec le chemin de clé de modèle "arrayController". – Chuck

+0

Mais alors, comment la table sait-elle quoi afficher dans chaque colonne? Je lie généralement une colonne aux objets organisés d'un NSArrayController défini dans le XIB. Comment obtenir le NSArrayController lié pour afficher les valeurs correctes dans chaque colonne? – Andy

1

Qu'en est-il de les configurer en tant qu'objets proxy dans IB, puis d'instancier le code actuel, peut-être dans le délégué de votre application?

+0

La seule référence que je pourrais trouver aux objets proxy personnalisés est http://developer.apple.com/documentation/DeveloperTools/Conceptual/IB_UserGuide/EditingNibFileObjects/chapter_4_section_4.html#//apple_ref/doc/uid/TP40005344-CH12-SW2 , mais c'est pour iPhone seulement. Ai-je manqué quelque chose? – Andy

1

Vous pouvez demander aux deux NSArrayControllers de se mettre à jour via KVO lors de l'ajout du tableau. L'astuce est que vous devez observer et ajouter au tableau d'une manière conforme à la norme KVO.

Vous voudriez un objet qui possède le tableau, appelons-le "modèle". Le tableau doit être une clé sur l'objet, appelons la clé "contentArray". Ensuite, lorsque vous ajoutez/supprimez de, vous devez le faire en appelant d'abord mutableArrayForKey sur "model" pour obtenir "contentArray". Ensuite, l'ajout/retrait du tableau doit fonctionner, par exemple:

Régulateur1 est lié à self.model.contentArray

Controller2 est lié à self.model.contentArray

//this method is on the "model" object 
-(void)addContent(id content) 
{ 
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"]; 
    [contentArr addObject:content]; //this will trigger KVO notifications 
} 

Sinon, vous pouvez faites les notifications KVO manuellement comme ceci:

-(void)addContent(id content) 
{ 
    [self willChangeValueForKey:@"contentArray"]; 
    [m_contentArray addObject:content]; 
    [self didChangeValueForKey:@"contentArray"]; 
} 
Questions connexes