Question

Je ne parviens pas à afficher le contenu d'un NSArrayController dans deux fenêtres définies dans des XIB différents.

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

Dans mon deuxième fichier XIB, j'ai 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 à l'aide de NSArrayController dans la fenêtre principale, la vue des données de la fenêtre secondaire n'est pas mise à jour. Ceci est probablement dû au fait qu'il ne sait pas qu'il doit se mettre à jour, son NSArrayController n'étant pas 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. Ainsi, si un objet est ajouté au tableau, les deux vues seront informées du changement.

Le problème est que je ne sais pas comment faire cela dans Interface Builder. Je ne peux pas lier un NSArrayController à un autre NSArrayController (une erreur d'exécution m'indique qu'elle ne peut être liée qu'à un NSArray). Connecter NSArrayController au membre NSArrayController de File's Owner ne vous aidera pas non plus, car cela effacera simplement le NSArrayController que je veux qu'il utilise.

Je pense que je pourrais définir moi-même les liaisons dans le code, mais il semble préférable d'utiliser Interface Builder si possible. Existe-t-il un moyen de faire cela dans Interface Builder, ou peut-être un meilleur moyen de configurer tout cela ensemble?

Mise à jour: En réponse à la réponse et aux commentaires de Chuck, j'ai essayé les solutions suivantes: -Associé le contenu de la table de mon NSTableView avec lesarrangésObjets du membre NSArrayController (si j'ai utilisé NSArrayController lui-même, une erreur est apparue dans le journal: "[NSArrayController count]: sélecteur non reconnu envoyé à l'instance"). - Reliez chaque colonne de la table au propriétaire du fichier, avec un chemin d'accès à la clé de modèle de arrayController.arrangedObjects.propertyName

Cela n'a toujours pas abouti à la mise à jour du contenu de la table. Je pense que cela est dû au fait que je lie les objetsarrovés du NSArrayController plutôt que le NSArrayController lui-même. Mais si je me lie directement à NSArrayController, cela me donne des erreurs.

Normalement, je sélectionnerais mon NSArrayController dans la liste "Lier à". ComboBox, utilisez arrangeObjects en tant que clé de contrôleur et la propriété elle-même en tant que chemin de clé modèle. Je ne suis pas sûr de savoir comment faire l'équivalent de cela dans ce cas - si je peux le faire du tout.

Est-ce que j'ai mal agi dans le processus ci-dessus?

Était-ce utile?

La solution

La meilleure option que j'ai pu trouver consiste à informer le deuxième NSArrayController que le tableau qu'il gère a été modifié en appelant rearrangeObjects: . Cela semble maladroit, mais cela fonctionne.

Autres conseils

Pourquoi ne pas les configurer en tant qu’objets proxy dans IB, puis instancier le code réel, peut-être dans le délégué de votre application?

Vous pouvez demander aux deux contrôleurs NSArray de se mettre à jour via KVO lorsque le tableau est ajouté. Le truc, c’est que vous devez observer et ajouter au tableau de manière compatible KVO.

Vous voulez 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 " modèle " pour obtenir "contentArray". Ensuite, l'ajout / la suppression du tableau devrait fonctionner, par exemple:

Controller1 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
}

Vous pouvez également faire les notifications KVO manuellement, comme suit:

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

Il n’ya aucune raison que deux contrôleurs RAID fassent en sorte qu’une vue ne soit pas mise à jour lorsque vous passez à une autre. Si cela ne se produit pas, il semblerait que vos notifications KVO se perdent quelque part. Très probablement, vous modifiez directement un tableau (dans la méthode add: d'une sous-classe NSArrayController, peut-être?) Sans envoyer les notifications de modification appropriées.

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