Modifier une ligne d'une tableview

chaps31chaps31 Membre
13:41 modifié dans API AppKit #1
Bonjour à  tous, je m'arrache les cheveux sur un pb... J'ai une tableview qui à  un tableau en datasource, jusque là  pas de scoop, sauf que je voudrais que pour une ligne donnée si la colonne acolumn de ce tableau prend une certaine valeur, alors la ligne correspondante dans  la tableview soit mise en évidence, soit par son texte en italique ou d'une autre couleur ou bien par un fond d'une couleur particulière pour la ligne en question, mais je ne trouve nulle part comment faire...  :)beta:
Pour le style du texte je ne vois pas comment appliquer un formatter à  une seule ligne de la tableview et pour la couleur de fond j'ai essayé de définir le rectangle avec rectOfRow mais visiblement ça ne fonctionne pas la position du rectangle (visible par la couleur de fond qu'il prend) n'est pas du tout dans la tableview... :crackboom:-

SOS Merci

Réponses

  • schlumschlum Membre
    13:41 modifié #2
    En renvoyant un NSAttributedString au niveau de "- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex", ça ne fonctionne pas ?
  • chaps31chaps31 Membre
    13:41 modifié #3
    Je teste ça cet aprèm', merci 
  • Philippe49Philippe49 Membre
    avril 2008 modifié #4
    En plus sophistiqué, j'essaierais ainsi :

    • Sous-classer NSTextFieldCell en  MyTextFieldCell avec une variable
                  BOOL specialDesign;
    • Dans IB , définir le type de la cellule à  MyTextFieldCell
    • Recoder les méthodes de dessins de la cellule.


    <br />#import &quot;MyTextFieldCell.h&quot;<br /><br />@implementation MyTextFieldCell<br /><br />-(void) drawWithFrame:(NSRect) cellFrame  inView:(NSView *)controlView<br />{<br />  if(!specialDesign){<br />      [super drawWithFrame:cellFrame inView:controlView];<br />  } else {<br />      // do what you want<br />  }<br />}<br /><br />-(void) drawInteriorWithFrame:(NSRect) cellFrame  inView:(NSView *)controlView<br />{<br />  if(!specialDesign){<br />      [super drawInteriorWithFrame:cellFrame inView:controlView];<br />  } else {<br />      // do what you want<br />  }<br />}<br /><br />@end
    


  • schlumschlum Membre
    13:41 modifié #5
    Eh oui, mais les NSCell, c'est par colonne, pas par ligne, donc du coup ça devient complexe ; il faut positionner le bit à  chaque passage dans la bonne ligne et l'enlever après...
  • Philippe49Philippe49 Membre
    avril 2008 modifié #6
    Il y a une NSCell à  chaque position (column,row). Une tableColumn est en gros une colonne (NSMatrix) de NSCell.

    Il faut que lorsque "a colonne acolumn de ce tableau prend une certaine valeur", le specialDesign soit activé pour toutes les cellules de la ligne chaque dessin de la cellule dans la ligne.
    On peut également faire une MyTextFieldCell différente pour chaque colonne.
  • schlumschlum Membre
    avril 2008 modifié #7
    dans 1209039392:

    Non, il y a une NSCell à  chaque position (column,row)

    Une tableColumn est en gros une colonne (NSMatrix) de NSCell.

    Il faut que lorsque "a colonne acolumn de ce tableau prend une certaine valeur", le specialDesign soit activé pour toutes les cellules de la ligne.
    On peut également faire une MyTextFieldCell différente pour chaque colonne.


    Non non, une seule NSCell par colonne...
    À moins que ça n'ait changé avec Leopard, mais dans NSTableColumn, il y a toujours les méthodes "- (id)dataCell" et "- (void)setDataCell:(NSCell *)aCell" à  priori  :P

    [Edit] En fait, 2 par colonne... Une pour le " header " et une pour le " content "
  • Philippe49Philippe49 Membre
    13:41 modifié #8
    dans 1209039817:

    Non non, une seule NSCell par colonne...


    Effectivement ... 

    Ma solution avec specialDesign marche en intervenant par exemple lors d'un
    - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

    Voici un exemple : (le code serait plus propre avec un lockFocus)
  • chaps31chaps31 Membre
    13:41 modifié #9
    Aà¯e faut que j'achète des rames...  ;)  Une idée :

    Ma tableView a donc un tableau en datasource, lui-même construit par assemblage de dictionnaires, que du classique, et si la colonne concernée était mise en AttributedString dès le dictionnaire avec l'attribut adéquat, ça marcherait ? Arrivée dans la tableview l'attributedstring serait bien affichée ?    ::)

    cette idée m'est venu en voulant mettre en pratique le conseil de Schlum (je met une majuscule à  Schlum parce-que c'est "Classe"...  ;D )  mais en l'occurence ça ne marche pas, mais jene suis pas certains de bien créer l'attributedstring

    Merci à  vous 2, Philippe49 je garde ton système un tantinet sophistiqué pour moi, en effet, sous le coude.
  • Philippe49Philippe49 Membre
    avril 2008 modifié #10
    dans 1209046425:

    Ma tableView a donc un tableau en datasource, lui-même construit par assemblage de dictionnaires, que du classique, et si la colonne concernée était mise en AttributedString dès le dictionnaire avec l'attribut adéquat, ça marcherait ? Arrivée dans la tableview l'attributedstring serait bien affichée ?    ::)


    sans problème (ce n'est pas la colonne qu'il faut mettre en AttributedString, mais l'objet représenté par la cellule)
  • chaps31chaps31 Membre
    13:41 modifié #11
    En effet, et YES ça marche  <3 <br />Seul truc bizarre : avec addAttribute:value:range ça marche impec, mais avec initWithString:Attributes: pas du tout... mystère...

    Encore merci à  vous 2
Connectez-vous ou Inscrivez-vous pour répondre.