2009-09-07 9 views
0

Dans ma configuration, j'ai un NSCollectionView de volumes connectés au mac. Pour la vue de NSCollectionViewItem, j'ai une NSBox avec un NSTableView à l'intérieur de la liste du contenu de ce volume.Mise à jour de NSTableView dans une instance de NSCollectionViewItem

Mon problème survient lorsque j'essaie d'ajouter/supprimer des éléments à NSTableView. La NSBox semble être initialisée une seule fois, il n'y a donc qu'une seule NSTableView. Cela signifie que lorsque je veux mettre à jour les données dans NSTableView, je ne peux pas appeler reloadData sur un IBOutlet et le mettre à jour toutes les tables.

Si je crée un IBOutlet dans une sous-classe de la NSBox, il est nul pour l'instance, donc je ne peux pas l'appeler via cela. Le plus proche est venu en entourant un @try @catch autour du code qui renvoie l'objet à une rangée dans une colonne, une exception se produit parce que cet élément n'existe plus, donc je peux saisir le tableView et appeler reloadData , qui semble mettre à jour ce NSTableView spécifique. Le problème avec ceci est que si l'élément retiré est à la fin de la table, ou si un élément est ajouté, l'exception ne se produira pas car il peut voir tous les éléments existants.

Est-ce que quelqu'un a déjà eu une expérience avec un NSTableView sur une vue NSCollectionViewItem? Comment avez-vous mis à jour les tables?

+0

J'ai écrit un [article de blog sur NSCollectionView] (http://benedictcohen.co.uk/files/5b81e3c40cee2daf88ceffe6eb556a63-3.php) que vous pouvez trouver utile. –

+0

Merci pour le guide. Je ne sais pas si les choses ont beaucoup changé depuis que vous l'avez écrit, mais j'ai trouvé que -LoadFromNib n'existait pas et utilisé -loadNibNamed à la place. – Septih

Répondre

1

Mettez la boîte NSBox (avec son NSTableView) dans sa propre plume. Chaque fois que vous créez un nouvel élément de vue de collection, chargez la plume, définissez NSBox comme vue de l'élément de vue de collection et libérez la boîte NSBox. En ce qui concerne l'alimentation des vues de table, le plus simple est probablement les liaisons. Liez chaque colonne de la vue de table à une propriété différente de l'objet de modèle que l'élément de vue de collection représente. Vous voudrez probablement passer par un contrôleur de tableau, bien sûr, ce qui signifie avoir un de ces éléments par vue de collection, et les ajouter à un tableau, que vous publierez dans dealloc.

+0

J'ai essayé, mais j'ai rencontré deux problèmes. Premièrement, le code que j'avais pour lier l'objet représenté ne fonctionne plus car l'IBOutlet que j'ai lié au nouveau CollectionViewItem sous-classé ne renvoie rien. Deuxièmement, le NSBox est écrasé de sorte que tout cela rentre dans le NSCollectionView alors qu'avant il était étalé sur deux colonnes et s'il y avait assez d'éléments, il défilait au lieu de les écraser. – Septih

+0

Mise à jour: J'ai corrigé le problème d'écrasement maintenant. Merci à sous-classe, minItemSize et maxItemSize. – Septih

+0

OK la sortie revenant nulle était due à l'ancienne vue que je traîné dans la nouvelle plume encore en cours de chargement (duh!) Et ce n'était pas connecté, ce qui a causé l'erreur. Tous triés maintenant :) – Septih