Sélection d'une cellule dans une tableView

beltbelt Membre
04:55 modifié dans API AppKit #1
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.

Réponses

  • Eddy58Eddy58 Membre
    04:55 modifié #2
    Il y a effectivement la solution de sous-classer la NSTableColumn et de surcharger sa méthode -(id)dataCellForRow:(int)row, mais je pense que le plus simple est d'utiliser la méthode delegate tableView:willDisplayCell:forTableColumn:row:, et de jouer avec la méthode setState. Code ci-dessous non garanti car jamais essayé, à  toi de jouer donc. ;) 

    [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]
  • beltbelt Membre
    04:55 modifié #3
    Je cherche toujours à  sélectionner une cellule donnée d'une NStableview plutôt qu'une ligne ou ine colonne entière.
    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.
  • Eddy58Eddy58 Membre
    juillet 2006 modifié #4
    Ok, c'est plus explicite, tu parles de la sélection d'édition et pas d'état, dans ce cas le problème est différent et la méthode tableView:willDisplayCell:forTableColumn:row: n'est pas prévue pour ça. Malheureusement je n'ai pas de réponse pour le moment, ce problème demande réflexion. :o

    [EDIT]
    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.

    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.
  • beltbelt Membre
    04:55 modifié #5
    Il me reste deux solutions :
    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...
  • BruBru Membre
    04:55 modifié #6
    Je te renvoie sur ce post où tu pourras y glaner des infos sur la façon de customiser l'affichage de la sélection dans une NSTableView.

    .
  • laurrislaurris Membre
    juillet 2006 modifié #7
    J'ai un truc en magasin pour faire ça (la selection par cellule). Apparemment mon code diffère de celui posté ici ou ailleurs dans le forum.

    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 ?  

    184629980_73c5602a78.jpg?v=0


    [Fichier joint supprimé par l'administrateur]
Connectez-vous ou Inscrivez-vous pour répondre.