Trier une colonne du Tableau

15:14 modifié dans API AppKit #1
Hello,

Je sais que plusieurs sujet évoque le trie par colonnes .. mais voilà  : Je suis vraiment paumé
Même la doc Apple sur NSSortDescriptor ne m'aide pas.
J'espère que vous pourrait m'aider
Tout ce que je veux c'est trier ma Array en cliquant sur l'une des colonne du tableau dont la key est "Name". Le tri doit se faire par ordre alphabétique, et inversement.

J'espère que vous pourrait m'eclaircir sur le sujet

@+

Réponses

  • Eddy58Eddy58 Membre
    octobre 2005 modifié #2
    Un exemple ? :)
    [tt]
       NSMutableArray *monArray;          // Array à  trier, initialisé par tes soins
    NSArray *tempArray;          // Array résultant temporaire
    NSSortDescriptor *sortDescriptor;  // Descripteur de tri
       BOOL nameAscending=YES;           // Sens de tri

    sortDescriptor=NSSortDescriptor alloc] initWithKey:@&quot;Name&quot; ascending:nameAscending]; <br />&nbsp; tempArray=[monArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor;
    [sortDescriptor release];
      [monArray release];
      monArray=[tempArray mutableCopy];
    [/tt]
  • 15:14 modifié #3
    Aaaah pourquoi faire simple quand on peut faire compliqué:

    [tt]NSMutableArray *monArray;          // Array à  trier, initialisé par tes soins
    NSSortDescriptor *sortDescriptor;  // Descripteur de tri   
    BOOL nameAscending=YES;           // Sens de tri
                
    sortDescriptor=NSSortDescriptor alloc] initWithKey:@&quot;Name&quot; ascending:nameAscending];   <br />[monArray sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor;   
    [sortDescriptor release]; [/tt]
  • Eddy58Eddy58 Membre
    15:14 modifié #4
    Ha oui, j'avais pas fait gaffe aux méthodes de tri dans NSMutableArray !! Ca va encore mieux ainsi. :P
  • 15:14 modifié #5
    Ha mais c'est tout bête ce truc !  :p
    J'associe
    - (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn
    
    et c'est nickel !
    Merci bcp à  vous 2 !
  • 15:14 modifié #6
    Bon ça marche très bien sauf que j'ai un vieux bogue graphique (ci-joint ,l'image)
    En fait, quand je clique sur une colone, on voit pas la fleche, pourtant ça tri !
    si je vais sur la dernière colone et que je clique dessus, la fleche de l'avant dernière s'affiche, je clique sur l'avant dernière, ça disparaà®t et apparaà®t sur la seconde (celle avant l'avant dernière).

    Galère :p

    Voilà  mon code :
    - (void)tableView:(NSTableView *)tv didClickTableColumn:(NSTableColumn *)tableColumn<br />{<br />	NSSortDescriptor *sortDescriptor;<br />	NSString *key;<br />	[self setAscending:nameAscending];<br />	key = [tableColumn identifier];<br />	<br />	sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:nameAscending];<br />	[tableColumn setSortDescriptorPrototype:sortDescriptor];<br />	[activeSet sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];&nbsp;  <br />	[sortDescriptor release];<br />	[self saveData];<br />	<br />}<br />- (void)setAscending:(BOOL)asc<br />{<br />	nameAscending = !asc;<br />	NSLog(@&quot;%i&quot;, nameAscending);<br />}<br />
    


    la méthode privée saveData contient un reloadData de la tableView



    [Fichier joint supprimé par l'administrateur]
  • Eddy58Eddy58 Membre
    octobre 2005 modifié #7
    Perso, je gère tout à  la main de ce côté là , avec la méthode setIndicatorImage:inTableColumn:.
    Et j'utilise plutôt la méthode delegate "-(void)tableView:(NSTableView *)tableView mouseDownInHeaderOfTableColumn:(NSTableColumn *)tableColumn" pour intercepter les cliques sur les headers columns. :)
  • 15:14 modifié #8
    Nickel  o:)
  • Eddy58Eddy58 Membre
    15:14 modifié #9
    Ha oui, juste un dernier détail, quand tu fais du tri sur des chaà®nes, il est mieux d'adapter ton sortDescriptor à  une casse insensible en rajoutant le sélecteur approprié : :)
    [tt]
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:nameAscending selector:@selector(caseInsensitiveCompare:)];
    [/tt]
  • 15:14 modifié #10
    J'ai pas très bien compris le but ?
  • Eddy58Eddy58 Membre
    15:14 modifié #11
    Avec une casse insensible, tes majuscules et minuscules pour une même lettre seront logées à  la même enseigne. :)
    Prenons par exemple, les lettres ci-dessous dans une colonne, ici la comparaison se fait avec une casse insensible :

    A
    a
    B
    b
    C
    c

    Et ci-dessous une comparaison avec une casse sensible :

    A
    B
    C
    a
    b
    c



  • GercofisGercofis Membre
    15:14 modifié #12
    j'ai pas tout capté mais mais mon code est tellement simple que je te le soumets

    <br />@interface LigneDeReleve : NSObject &lt;NSCoding&gt; {<br />...<br />...<br /> NSCalendarDate *mDate;<br />....<br />....<br />-( NSComparisonResult )ordreDate:( LigneDeReleve * )laLigne {<br />&nbsp; &nbsp; return [[self mDate] compare:[laLigne mDate]];<br />}<br />// Le delegate de la fenetre document...<br />-(void)tableView:(NSTableView *)tableView <br />didClickTableColumn:(NSTableColumn *)aTableColumn<br />{<br />	NSLog(@&quot;didClickTableColumn&quot;);// pour visualiser la reception du message<br />	NSString *identifieur = [aTableColumn identifier];<br />&nbsp; &nbsp; if([identifieur isEqual:@&quot;mDate&quot;])<br />&nbsp; &nbsp; {<br />	[TableLigneDeReleve sortUsingSelector:@selector(ordreDate:)];<br />	[self recalculDesLignes:0];//traitement après trie...<br />&nbsp; &nbsp; }<br />}<br />
    
  • 15:14 modifié #13
    Ok pour les casses sensibles. ça me servira pas pour l'instant en tout cas
  • octobre 2005 modifié #14
    Gercofis ton problème vient du fait que la méthode associée au sélecteur ne doit pas être implémentée au niveau du controlleur, mais au niveau de nsdate (les catégories sont appropriées pour cela). Cette méthode est appelée pour comparer les éléments du tableau entre eux (ce qui dans ton cas signifie qu'ils sont envoyés à  des instances de NSDate et non au controlleur).
  • GercofisGercofis Membre
    15:14 modifié #15
    mais ça marche nicket et tout seul....
  • 15:14 modifié #16
    Oups, je n'avais pas relevé que le fait que le code contenu dans le même cadre provenait de fichiers différents. Effectivement, ça ne peut que marcher dans ce cas ;).
Connectez-vous ou Inscrivez-vous pour répondre.