Tri dans une NSTableView

VeillardVeillard Membre
23:54 modifié dans API AppKit #1
Bonjour,

J'ai un problème dans le tri de ma TableView. Quand je clique sur l'en-etête de la colonne le tri s'effectue bien dans l'ordre croissant mais quand je clique à  nouveau, j'aimerais bien que le tri dans l'ordre décroissant s'effectue. J'ai essayé ceci :
:why?:

-(void) tableView:(NSTableView*)tableView didClickTableColumn:(NSTableColumn *)tableColumn<br />{<br />  NSSortDescriptor *aDescriptor;<br /><br />      aDescriptor=[[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending:YES selector:@selector(compare:)];<br /><br />  [[tableView tableColumnWithIdentifier:[tableColumn identifier]] setSortDescriptorPrototype:aDescriptor];<br /><br />    NSArray *sortDescriptorArray = [NSArray arrayWithObject:aDescriptor];<br />     [aDescriptor release];<br /><br />      [tableView setSortDescriptors:sortDescriptorArray];<br /><br /> [tableauDesPlongees sortUsingDescriptors:[tableView sortDescriptors]];<br />    <br />  [tableView reloadData];<br />}<br />


J'ai oublié quelque chose mais quoi ? ???

Merci à  tous

Réponses

  • cbrandtcbrandt Membre
    novembre 2004 modifié #2
    euh, je n'ai jamais utilisé les sortdescriptors pour trier les nstableview... cepandant dans ton code:
    dans 1100422764:

    <br />    aDescriptor=[[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending:YES selector:@selector(compare:)];<br />
    


    essayes d'utiliser une variable membre (bool) dans ton delegate pour te souvenir de l'ordre de tri:
    <br />...<br />     aDescriptor=[[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending: _triCroissant selector:@selector(compare:)];<br />_triCroissant = !_triCroissant;<br />...<br />
    


    [edit]
    en fait c'est pas complet, il ne faut inverser l'ordre de tri que si on clique la colonne déjà  triéé... il faut donc se souvenir de la précédenet colonne sélectionnée, et si c'est la même, alors inverser le booléen:

    <br />...<br /> aDescriptor=[[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending: _triCroissant selector:@selector(compare:)];<br />if (_idColonne == [tableColumn identifier])<br />    _triCroissant = !_triCroissant;<br />else<br />    _idColonne =  [tableColumn identifier];<br />...<br />
    

    _idColonne étant un NSString membre de ton delegate...
    il y a sûrement plus simple, mais ça devrait marcher (attention: non testé !  j'ai pondu ça en quelques minutes à  l'instant !)
    [/edit]

    voilà  voilà ...
  • VeillardVeillard Membre
    23:54 modifié #3
    OK merci, je vais essayer tout de suite  :D
  • VeillardVeillard Membre
    23:54 modifié #4
    Bon, j'ai essayé et ça ne fonctionne toujours pas  :'(
    Je vais voir si je n'ai pas fait une erreur quelque part...
  • cbrandtcbrandt Membre
    novembre 2004 modifié #5
    ben, j'ai copié ton bout de code tel quel, puis j'ai ajouté mes modifs suggérées, et ça marche...
    j'ai juste dû changer un peu l'ordre:
    <br />if (_idColonne == [tableColumn identifier])<br /> _triCroissant = !_triCroissant;<br />else<br />_idColonne = [tableColumn identifier];<br /> aDescriptor=[[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending: _triCroissant selector:@selector(compare:)];<br />
    


    [edit]
    tu as bien mis _triCroissant et _idColonne en membres de ta classe et pas en variables locales ?
    [/edit]
  • VeillardVeillard Membre
    23:54 modifié #6
    Non, j'avais mis les variables en local.
    Comment on fait pour les mettre en membre de la classe ? j'ai quelques lacunes  :-\
  • cbrandtcbrandt Membre
    novembre 2004 modifié #7
    j'ai regardé d'un peu plus près comment le Finder gère l'ordre du tri, et en fait il garde un ordre par colonne, alors que dans notre cas on n'a qu'un ordre général.

    il faudrait pour gérer ça utiliser un dictionnaire de booléens, avec l'id de la colonne comme clé:

    ajoute dans ton .h les membres de ta classe:
    <br />    NSMutableDictionary             *_triCroissant;<br />   NSString                                        *_idColonne;<br />
    


    modifies didClickTableColumn comme suit:
    <br />-(void) tableView: (NSTableView*) tableView didClickTableColumn: (NSTableColumn*) tableColumn<br />{<br />        NSSortDescriptor        *aDescriptor;<br />     NSString                        *ident;<br />   BOOL tri;<br /><br /><br />     ident = [tableColumn identifier];<br /> if (_idColonne == ident)<br />  {<br />         tri = ! [[_triCroissant objectForKey: ident] boolValue];<br />          [_triCroissant setObject: [NSNumber numberWithBool: tri] forKey: ident];<br />  }<br /> else<br />      {<br />         tri = [[_triCroissant objectForKey: ident] boolValue];<br />            _idColonne = ident;<br />       }<br /> <br />  aDescriptor=[[NSSortDescriptor alloc] initWithKey:[[tableColumn sortDescriptorPrototype] key] ascending: tri selector:@selector(compare:)];<br /><br /> [[tableView tableColumnWithIdentifier:[tableColumn identifier]] setSortDescriptorPrototype:aDescriptor];<br /><br />    NSArray *sortDescriptorArray = [NSArray arrayWithObject:aDescriptor];<br />     [aDescriptor release];<br /><br />      [tableView setSortDescriptors:sortDescriptorArray];<br /><br /> [tableauDesPlongees sortUsingDescriptors:[tableView sortDescriptors]];<br /><br />      [tableView reloadData];<br />}<br />
    


    et ajoute dans awakeFromNib:
    <br />    _triCroissant = [[NSMutableDictionary alloc] init];<br />
    



    [edit]
    pour mettre en membres de ta classe, c'est comme tableauDesPlongees
    voici un exemple:
    <br />@interface MyWindowController : NSWindowController &lt;CBFtpClient&gt;<br />{<br />&nbsp; &nbsp; IBOutlet NSTableView             *localTable;<br />&nbsp; &nbsp; IBOutlet NSPopUpButton          *localPopup;<br />&nbsp; &nbsp; IBOutlet NSTableView            *remoteTable;<br />&nbsp; &nbsp; IBOutlet NSPopUpButton         *remotePopup;<br />&nbsp; &nbsp; IBOutlet NSButton                      *putButton;<br />&nbsp; &nbsp; IBOutlet NSButton                        *getButton;<br />&nbsp; &nbsp; IBOutlet NSProgressIndicator     *remoteSpinner;<br />&nbsp; &nbsp; IBOutlet NSWindow                    *connectSheet;<br />&nbsp; &nbsp; NSMutableDictionary           *_triCroissant;<br />   NSString                                *_idColonne;<br />&nbsp; &nbsp; NSMutableArray          *_localArray;<br />&nbsp; &nbsp; NSMutableArray         *_remoteArray;<br />&nbsp; &nbsp; NSDictionary          *_connectionParams;<br />&nbsp; &nbsp; CBFtp                    *_ftp;<br />&nbsp; &nbsp; int                           _state;<br />&nbsp; &nbsp; NSString                     *_remotePath;<br />&nbsp; &nbsp; NSString                       *_localPath;<br />}<br />@end<br /><br />
    


    [/edit]
  • VeillardVeillard Membre
    23:54 modifié #8
    Merci beaucoup pour tes explications, je complète petit à  petit mes connaissances 

    Et en plus ça marche ! :brule: :brule: :brule:

    Je vais en profiter pour améliorer mon appli.

    Ca fait 2 mois que je galère  :'(

    Encore merci 
  • cbrandtcbrandt Membre
    23:54 modifié #9
    ravi d'avoir pû t'aider !
    :trinque:
  • MulotMulot Membre
    août 2007 modifié #10
    Je profite de ce topic pour vous poser une question qui me turlupinne depuis quelques temps.

    J'ai remarqué que dans Interface Builder, quand on sélectionne une colonne d'un tableView, on peut ajouter une sortKey et un sortSelector pour une colonne, j'ai essayé d'utiliser ceic tel quel mais ça ne marche pas, j'ai bien la flèche qui est soit en bas soit ne haut, qui change de sens mais rien ne change dans ma tableView.

    J'aimerai utiliser cette solution car la mienne actuellement est assez rededontante niveau code, et je me trimballe X booléens, étant donné que j'ai x colonnes. De plus les flèches "d'ordre" n'apparaissent pas.

    Est ce que le sortDescriptor  demandé dans IB doit être un selector de tri sur le tableau qui sert de dataSource à  ma tableView ?

    Edit: Saleté d'onglet, il m'en restait un que j'avais pas vu qui répondait à  ma question de sortKey et cie via IB, et vu que j'utilsie pas les bindings ! Problème "résolu" !

Connectez-vous ou Inscrivez-vous pour répondre.