Sélection d'une cellule dans une tableView
belt
Membre
Bonjour,
J'aimerais sélectionner une (ou plusieurs cellules) dans une NStableView (à la façon d'Excel). Pour cela il y a la méthode selectCell de NSControl dont hérite NStableView :
- (void)selectCell:(NSCell *)aCell
Cependant une NSTableColumn n'est liée à priori que deux NSCell : l'une pour le header de la colonne et une autre qui sert pour toutes les cellules de la colonne.
Faut-il absolument attribuer à chaque cellule d'une colonne une NSCell différente pour pouvoir en sélectionner une seule ? Quelqu'un aurait-il une meilleure solution ?
Merci pour votre aide.
J'aimerais sélectionner une (ou plusieurs cellules) dans une NStableView (à la façon d'Excel). Pour cela il y a la méthode selectCell de NSControl dont hérite NStableView :
- (void)selectCell:(NSCell *)aCell
Cependant une NSTableColumn n'est liée à priori que deux NSCell : l'une pour le header de la colonne et une autre qui sert pour toutes les cellules de la colonne.
Faut-il absolument attribuer à chaque cellule d'une colonne une NSCell différente pour pouvoir en sélectionner une seule ? Quelqu'un aurait-il une meilleure solution ?
Merci pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[tt]
-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
if (row==3 || row==6)
{
[cell setState:NSOnState];
}
else
{
[cell setState:NSOffState];
}
}
[/tt]
J'avais déjà fait quelques essais peu fructueux avec la méthode tableView:willDisplayCell:forTableColumn:row:, mais en utilisant
[ myTableView selectCell: cell ] au lieu de [ cell setState: NSOnState ].
Mais malheureusement, même suivi d'un [ myTableView setNeedsDisplay: YES], je n'arrive pas dans les deux cas à sélectionner la cellule dans laquelle j'ai cliqué.
J'ai plutôt l'impression que le problème vient du fait que la NSCell fournie pointe plus ou moins sur la dernière cellule éditée (ou affichée ?), mais pas du tout forcément sur celle où l'on vient de cliquer.
Il manquerait une méthode déléguée : -tableView:willClickCell:forTableColumn:row: (ou bien didClickCell)
De plus, je trouve bizzare, c'est qu'il y a nulle part une méthode qui dessine la sélection d'une cellule donnée.
Je continue à chercher.
[EDIT]
Si, il y a la méthode editColumn:row:withEvent:select:, mais il est impératif que la rangée soit sélectionnée.
Je crois tout simplement que NSTableView n'est pas une classe conçue pour de tels cas, ce n'est pas prévu dans son comportement. Personnellement je m'orienterais sur NSMatrix qui laisse toutes libertées, dont entre autres les sélections multiples.
1) Utiliser une NSMatrix, mais je perd tous les raffinements d'une NStableView, où alors il faudra tout ré-écrire ! (long)
2) Utiliser tout de même une NStableView sous-classée, mais en gérant moi-même toute la partie sélection. Cela implique qu'il faut désactiver la sélection en ligne et en colonne de la NStableView avec :
- (BOOL)tableView:(NSTableView *)table shouldSelectRow:(int)rowIndex{return NO ;}
- (BOOL)tableView:(NSTableView *)table shouldSelectTableColumn:(NSTableColumn *)col{ return NO ;}
Cela demande aussi que je gère moi-même la sélection des cellules sélectionnées. Après tout il ne s'agit que de redessiner la couleur du fond des cellules !
Pour référencer les zones sélectionnées, je peux stocker dans un NSArray les NSRange en x et en y de chaque zone sélectionnée.
Plus compliqué, mais sans doute faisable, je pourrais même envisager d'implémenter de drag and drop, au moins à l'intérieur de la NStableView...
Bon, Y'a pas mal à bosser... Je vais essayer...
.
Comme ça fait un bail, je ne me souviens plus où je l'ai trouvé. En tout cas, pour simplement selectionner 1 cellule (pas plusieurs) ça marche.
C'est un peu long à copier (3 classes) alors je poste le projet xcode. En plus la table est gérée par bindings comme ça on peut voir les problèmes éventuels que celà pose.
NB1: les couleurs sont assez arbitraires.
NB2: Pour sélectionner une cellule, il faut cliquer sur une ligne déjà sélectionnée.
NB3: Pour l'instant on ne peut pas éditer de cellule avec un double-click. Est-ce vraiment impossible ? Â
[Fichier joint supprimé par l'administrateur]