2008-11-20 9 views
2

J'ai une sous-classe NSTableView personnalisée qui est liée à une source de données (un NSArray) qui se met à jour de manière asynchrone. Lorsque des éléments sont ajoutés au tableau, les lignes sont automatiquement ajoutées au tableau. Impressionnant!Comment puis-je détecter que le nombre de lignes d'un NSTableView a changé?

Ma question est la suivante: Comment puis-je détecter que cette magie s'est produite afin que je puisse effectuer d'autres tâches liées à l'affichage de ma vue de table personnalisée? Y a-t-il une méthode que je peux remplacer dans ma sous-classe qui sera appelée quand la tableview est mise à jour?

+0

Pouvez-vous expliquer exactement ce que votre sous-classe doit faire? Généralement, lorsque vous manipulez une vue de table, vous utilisez son délégué, une cellule personnalisée ou une colonne de table ou remplacez l'une des méthodes de dessin de la table. J'ai de la difficulté à penser à un exemple qui se rapporte à ce que vous demandez. –

+0

Assez juste. Je veux ajuster la hauteur de la table en fonction du nombre de lignes qu'elle contient. Quand il atteint une certaine limite (disons 10 lignes), je vais lui permettre de défiler, mais pour les lignes 1-9, je veux juste qu'il devienne plus grand sur l'écran. –

Répondre

5

Vous n'avez pas besoin de sous-classer NSTableView pour modifier sa hauteur en fonction du nombre de lignes. Dans votre contrôleur, surveillez simplement le tableau de données à l'aide de KVO et ajustez la taille d'image de la vue de défilement de la table (vous pouvez la trouver en utilisant enclosingScrollView) lorsque des lignes sont ajoutées ou supprimées. J'ai déjà utilisé cette technique auparavant et ça a bien marché. Vous pouvez utiliser les méthodes rowHeight et intercellSpacing de tableview pour calculer la hauteur de la trame.

+0

Excellent! Je vous remercie. C'est ce que je cherchais :) –

+0

Comme un suivi en retard, je voulais juste mentionner que cette solution a parfaitement fonctionné. Le cacao rend les choses assez simples avec KVC/KVO. Merci encore. –

2

Regardé haut et bas pendant des jours sur cette solution. Cela a fonctionné comme un charme, merci! Voici un exemple de mon code que les autres utilisateurs peuvent suivre:


// tv = NSTableView 
// view = NSView 

int height = ([tv rowHeight] + [tv intercellSpacing].height) * [itemNodes count]; 

NSScrollView *sv = [tv enclosingScrollView]; 

NSRect svFrame = [sv frame]; 
svFrame.size.height = height; 
[sv setFrame:svFrame]; 

NSRect viewFrame = [view frame]; 
viewFrame.size.height = height; 
[view setFrame:viewFrame]; 
Questions connexes