Gérer un NSButonCell dans un NSTableView

Eddy58Eddy58 Membre
17:46 modifié dans API AppKit #1
J'initialise une NSTableColumn avec un NSButonCell de la façon suivante :
<br />NSButtonCell *switchButtonCell=[[NSButtonCell alloc] init];<br />[switchButtonCell setButtonType:NSSwitchButton];<br />[switchButtonCell setImagePosition:NSImageOnly];<br />[switchButtonCell setTitle:@&quot;&quot;];<br />[[clientsMaintenancesTableView tableColumnWithIdentifier:@&quot;essai&quot;] setDataCell:switchButtonCell];<br />[switchButtonCell release];<br />


Ensuite, quand je teste, et clique sur les switch dans la colonne, l'état n'est pas gardé. :(
Comment faire pour gérer le changement d'état et la récupération d'état des switchs ?
Je pense que la méthode delegate pour changer l'apparence des cells joue un role important, je n'ai pas encore essayé, quelqu'un a-t-il un bon exemple ou un bon tuyau (sans bindings svp ) ;D

Réponses

  • cbrandtcbrandt Membre
    octobre 2004 modifié #2
    salut,

    il suffit d'implémenter
    - (void) tableView: (NSTableView*) aTableView setObjectValue: (id) anObject forTableColumn: (NSTableColumn*) aTableColumn row: (int) rowIndex
    dans la datasource - le paramètre 'anObject' reçu sera un NSNumber.

    dans l'autre sens, pour mettre la valeur, dans
    - (id) tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn*) aTableColumn row: (int) rowIndex
    renvoyer un objet de type NSNumber..

    Par ailleurs, ton setImagePosition est inutile...

    Doc apple
  • muqaddarmuqaddar Administrateur
    17:46 modifié #3
    Attention à  la taille des liens...
    N'hésitez pas à  les encapsuler en hyperlink dans un mot. :)
  • cbrandtcbrandt Membre
    17:46 modifié #4
    oui, maà®tre  :)
  • Eddy58Eddy58 Membre
    17:46 modifié #5
    Merci cbrandt ! :)
    La doc Apple, je l'ai déjà  parcourue de long en large, et elle est loin d'être exhaustive sur le sujet de la gestion des boutons dans les NSTableviews...Le coup du NSNumber faut le savoir. ;D Je suppose que c'est aussi avec NSNumber que l'on gère les autres types de boutons...
    Le setImagePosition a toute son utilité, car en lui fournissant le paramètre NSImageOnly, cela a pour effet de centrer le bouton dans sa colonne, sinon il s'aligne à  gauche.
    Bon voici un petit récapitulatif résumé pour ceux qui se poseraient des questions plus tard sur le sujet : :)

    <br />// Initialisation de la colonne &quot;switchcolonne&quot; avec la NSButtonCell de type switch<br />-(void)awakeFromNib<br />{<br />NSButtonCell *switchButtonCell=[[NSButtonCell alloc] init];<br />[switchButtonCell setButtonType:NSSwitchButton];<br />[switchButtonCell setImagePosition:NSImageOnly];<br />[switchButtonCell setTitle:@&quot;&quot;];<br />[[tableView tableColumnWithIdentifier:@&quot;switchcolonne&quot;] setDataCell:switchButtonCell];<br />[switchButtonCell release];<br />}<br /><br />// DataSource méthode : Réglage de l&#39;état des switch boutons<br />// &quot;array&quot; est un NSMutableArray défini dans l&#39;interfaçage, et initialisé à  sa guise...<br />// La méthode accesseur switchOption fait partie de la classe &quot;Classe&quot;<br />-(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row<br />{<br />     Classe *classeObject=[array objectAtIndex:row];<br />       if ([[tableColumn identifier] isEqualToString:@&quot;switchcolonne&quot;])<br />    {<br />         if ([classeObject switchOption]==NO)<br />              {<br />                 return [NSNumber numberWithInt:0];<br />                }<br />         else<br />              {<br />                 return [NSNumber numberWithInt:1];<br />                }<br /> }<br /><br />   return nil;<br />}<br /><br />// DataSource méthode : Récupération de la valeur des switchs boutons.<br />// La méthode accesseur setSwitchOption fait partie de la classe &quot;Classe&quot;<br />-(void)tableView:(NSTableView *)tableView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn row:(int)row<br />{<br />    if ([[tableColumn identifier] isEqualToString:@&quot;switchcolonne&quot;])<br />        {<br />         [[array objectAtIndex:row] setSwitchOption:[object boolValue]];<br />   }<br />}<br /><br />// Delegate méthode : Changement d&#39;attribut des cells pour mettre les switchs en <br />// mode enabled ou disabled<br />// Ici par exemple, mettre le switch de la row 0 en disabled, et tous les autres enabled<br />-(void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(int)row<br />{<br /> if ([[tableColumn identifier] isEqualToString:@&quot;switchcolonne&quot;])      <br />       {<br />            if (row==0)<br />               {<br />                 [cell setEnabled:NO];<br />             }<br />         else <br />             {<br />                 [cell setEnabled:YES];<br />            }<br /> }<br />}<br />
    
  • Eddy58Eddy58 Membre
    17:46 modifié #6
    Sinon, à  partir de Panther, on peut supprimer toute la partie initialisation dans awakeFromNib:, et dans IB faire glisser le NSButtonCell sur le header de la colonne. Le seul petit problème par rapport à  l'initialisation par programmation est qu'il n'y a pas de centrage des cells (peut-être Tiger va-t-il corriger ceci ?), donc la colonne doit être dimensionnée pour prendre ceci en compte. :)
  • wiskywisky Membre
    17:46 modifié #7
    on peut centrer dans IB. Il faut double cliquer sur le tableview puis sur l'entête de la colonne. Dans l'inspecteur il faut mettre le centrage des datas.
    Puis en cliquand sur le petit triangle à  droite de l'entête tu demande image seulement pour les buttoncell.
    chez mois ça marche ;)
  • Eddy58Eddy58 Membre
    17:46 modifié #8
    Tout à  fait macintosh_plus, mais ceci n'est possible que sous X-Code 2.x, X-Code 1.x, sous lequel j'étais à  l'époque, met en mode disabled les choix d'options "Alignment" et "Icon Pos", donc le passage par la programmation était obligé pour le centrage des cells. Mais c'est quand même bien de souligner cela, c'est toujours ça de moins à  coder maintenant. :)
Connectez-vous ou Inscrivez-vous pour répondre.