Changer la couleur du fond d'une cellule dans une NSTableView

beltbelt Membre
04:59 modifié dans API AppKit #1
Bonsoir à  tous
J'ai essayé de changer la couleur (en bleu) du fond d'une cellule (row n°2 et col n°2). J'ai implémenté ceci dans le delegate, mais ça ne marche pas ! Sauriez vous pourquoi ? Merci pour votre aide !
- (void)tableView:(NSTableView *)table willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)col row:(int)row
{
id obj = [ table tableColumns ] ;
id colonne = [ obj objectAtIndex: 2 ] ;
if ( row == 2 && [ colonne isEqualTo: col ] )
  [ table setBackgroundColor: [NSColor blueColor ] ] ;
}

Réponses

  • Eddy58Eddy58 Membre
    04:59 modifié #2
    Cela m'a l'air normal vu que tu demandes le changement de couleur de la table et pas de la cell. :o
    En outre il ne faut pas oublier de gérer l'état de toutes les cells, et donc ici de prévoir la couleur normale quand la rangée n'est pas concernée.
    [tt]
    - (void)tableView:(NSTableView *)table willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)col row:(int)row
    {
    id obj = [ table tableColumns ] ;
    id colonne = [ obj objectAtIndex: 2 ] ;
    if ( row == 2 && [ colonne isEqualTo: col ] )
      {
        [cell setBackgroundColor: [NSColor blueColor ]];
      }
      else
      {
        [cell setBackgroundColor: [NSColor whiteColor ]];
      } 
    }
    [/tt]
  • laurrislaurris Membre
    juillet 2006 modifié #3

    Moi je dirais qu'il faut sous-classer une NSTextFieldCell et lui mettre ça dans le ventre:

    - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    { 
    [[NSColor redColor] set];
    NSRectFill(cellFrame);
    }

    Si on prend une couleur un peu foncée il faut aussi penser à  redessiner le texte en blanc.
    Ah et j'oubliais: il faut faire un [colonne setDataCell: cellsousclassée ] sur les colonnes concernées.

    Mais si la méthode avec setbackground marche ça m'intéresse ! Ca voudrais dire que je me suis fait ch*** des heures pour rien.
  • beltbelt Membre
    04:59 modifié #4
    La méthode avec [cell setBackgroundColor ] ne semble pas fonctionner ! Pourquoi ? Cela devrait. Les classes Cocoa sont quelquefois si mystèrieuses...
    J'essaie la seconde méthode (en sous classant NSTextFieldCell)...
  • Eddy58Eddy58 Membre
    04:59 modifié #5
    Ca devrait normalement aller mieux ainsi : :)
    [tt]
    - (void)tableView:(NSTableView *)table willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)col row:(int)row
    {
    id obj = [ table tableColumns ] ;
    id colonne = [ obj objectAtIndex: 2 ] ;
    if ( row == 2 && [ colonne isEqualTo: col ] )
      {
          [cell setDrawsBackground:YES];
          [cell setBackgroundColor: [NSColor blueColor ]];
      }
      else
      {
        [cell setDrawsBackground:NO];
        [cell setBackgroundColor: [NSColor whiteColor ]];
      } 
    }[/tt]
  • beltbelt Membre
    04:59 modifié #6
    Désolé, mais cela ne marche toujours pas !
    Quand je disais que les classes Cocoa ont toujours qq chose de mystérieux !
    Par contre, en sous classant NSTextFieldCell et en implémentant :
    - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView

          [[NSColor blueColor] set];
          NSRectFill(cellFrame); 
    }
    ça marche !
  • BruBru Membre
    04:59 modifié #7
    dans 1152789618:

    Désolé, mais cela ne marche toujours pas !
    Quand je disais que les classes Cocoa ont toujours qq chose de mystérieux !
    Par contre, en sous classant NSTextFieldCell et en implémentant :
    - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    { 
          [[NSColor blueColor] set];
          NSRectFill(cellFrame);   
    }
    ça marche !


    Il n'y a pas de mystère là  dedans.
    Si le code d'Eddy ne marche pas avec toi, c'est que tu as MYSTERIEUSEMENT oublié de mettre ton contrôleur (celui qui contient la méthode d'Eddy) comme delegate de la table.

    Maintenant si sous-classer fonctionne, alors...
    Moi aussi, j'arrive à  tuer un puceron avec un bazooka !

    .
  • beltbelt Membre
    04:59 modifié #8
    Et non, j'ai bien mis le delegate ! Le pb est ailleurs !
  • beltbelt Membre
    04:59 modifié #9
    Milles excuses. Je m'étais quelque peu embrouillé dans mes projets ! ça marche. Et merci à  tout le monde !
Connectez-vous ou Inscrivez-vous pour répondre.