Comment mettre un bouton ou image dans un NSTableView

meallmeall Membre
04:54 modifié dans API AppKit #1
Hi,

J,essai de faire un peu comme dans certaines applications où l'on voit des check box et des image (et éventuellement du texte aussi) dans un tableau qui ressemble à  un NSTableView. Par exemple, dans Leopard et Tiger, le panneau Sync de .Mac a un truc similaire à  ce que j'aimerais faire.

Est-ce que quelqu'un pourrait me pointer un tutorial pour voir comment on fait ça? IB me donen pas tellement le choix, alors je me demande si je dois le forcer par programmation ou entièrement utiliser une approche différente.

Merci

Réponses

  • schlumschlum Membre
    04:54 modifié #2
    Non, on peut le faire dans IB...
    Il suffit de glisser une NSButtonCell sur la colonne.

    Par contre, après il faut implémenter les fonctions supplémentaires du delegate pour le gérer.
  • BruBru Membre
    04:54 modifié #3
    dans 1195291671:

    Par contre, après il faut implémenter les fonctions supplémentaires du delegate pour le gérer.


    Les méthodes du data-source suffisent pour gérer le bouton (tableView:objectValueForTableColumn:row: pour l'état du bouton, et tableView:setObjectValue:forTableColumn:row: pour récupérer/mémoriser quand l'utilisateur a cliqué dessus).

    .
  • schlumschlum Membre
    04:54 modifié #4
    Oui, désolé, je me suis emmêlé les pinceaux entre "dataSource" et "delegate"  :o
  • AliGatorAliGator Membre, Modérateur
    04:54 modifié #5
    Hello,

    Je déterre ce sujet... parce que je cherche à  faire la même chose (une checkbox dans ma TableView), et j'ai du mal à  voir comment faire.

    Enfin plus exactement :
    1) d'une part c'est une NSOutlineView et pas une NSTableView (mais je ne pense pas que ça change bcp le problème),
    2) et d'autre part j'arrive à  remplir la Outline/TableView en faisant cocher la case selon mes besoins... en retournant un [NSNumber numberWithBool:...] dans la méthode de dataSource pour la colonne en question... mais ça ça va  quand c'est une colonne dédiée à  la checkbox.

    Or moi dans ma colonne avec la Checkbox, il y a à  la fois l'état de la checkbox (cochée ou pas) ET le texte à  droite de la checkbox que je veux différent pour chaque ligne...

    Alors pour l'instant en dépannage j'ai dédié une colonne de ma OutlineView avec juste la checkbox, dont j'arrive à  régler l'état selon la valeur voulue via mon dataSource... et une colonne à  côté pour le texte.
    Mais comme en plus c'est une OutlineView et que cette colonne où je veux checkbox+texte c'est la première colonne, celle qui contient les triangles et voit son contenu indenté selon le niveau hiérarchique... ça fait moyen.


    Une solution, pour que mon dataSource renseigne à  la fois l'était coché/décoché de la Checkbox (ButtonCell) et son texte ?

    Merci à  vous ;)
  • Philippe49Philippe49 Membre
    04:54 modifié #6
    Une check box cell ?
  • mpergandmpergand Membre
    avril 2009 modifié #7
    Salut à  tous,

    Il faut modifier les cells à  la volée dans la méthode:
    - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item

    Dans ton cas il suffit de faire:
    if([[tableColumn identifier] isEqualToString:@checkbox])
      [cell setTitle:@xxx];
  • AliGatorAliGator Membre, Modérateur
    04:54 modifié #8
    Merci mpergand...

    En fait c'est la seule solution que j'avais trouvée en lisant la doc, utiliser cette méthode de delegate pour altérer ma "CheckBox Cell" à  la volée pour modifier son titre... Mais je trouvais ça pas propre (pas MVC) d'utiliser une méthode de delegate pour altérer le contenu, ça devrait être à  une méthode du dataSource de faire ça...

    Mais bon, apparemment passer par cette méthode de delegate pour "régler" le contenu de ma checkbox cell, c'est la seule solution... ::)

    Merci
  • mpergandmpergand Membre
    04:54 modifié #9
    Mais je trouvais ça pas propre (pas MVC) d'utiliser une méthode de delegate pour altérer le contenu, ça devrait être à  une méthode du dataSource de faire ça...

    Disons que ça fait un peu désordre  ;)
    Mais c'est tout à  fait MVC, title étant un  attribut de NSCell.

    Maintenant, c'est pas très compliqué de tout faire dans le dataSource, il faut sous classer NSButtonCell et faire:
    -(void) setObjectValue:(NSDictionary*) attr<br />{<br />	[self setIntValue:[[attr objectForKey:@&quot;state&quot;] intValue]];&nbsp; // ou setState<br />	[self setTitle:[attr objectForKey:@&quot;title&quot;]];<br />}
    


    Et donc dans le dataSource:
    NSDictionary* attr=[NSDictionary dictionaryWithObjectsAndKeys:<br />		[NSNumber numberWithInt:state],@&quot;state&quot;,<br />		title,@&quot;title&quot;,nil];<br /><br />	return attr;
    

  • AliGatorAliGator Membre, Modérateur
    04:54 modifié #10
    Lol, t'es devin, j'y avais pensé aussi... limite je me demandais si ça n'existait pas déjà ... mais j'avais rien trouvé dans la doc à  mon grand étonnement sur ce genre de possibilité intégrée direct... et un peu la flemme de faire une sous-classe juste pour ça :P

    J'en suis resté à  la méthode de delegate... d'ailleurs maintenant je fais tout dedans pour ce qui est de ma NSButtonCell (pour les autres colonnes je remplis dans la méthode de dataSource, mais pour la CheckBox Cell, j'ai préféré centraliser à  la fois le NSButtonState et le title au même endroit, dans la méthode de delegate, plus simple à  relire. Et puis ça me permet de fixer le "allowsMixedState" de ma CheckBox cell selon chaque cas (vu que dans mon cas ça dépend de la ligne, aussi)...
Connectez-vous ou Inscrivez-vous pour répondre.