SortDescriptors tableView

Bonjour à  tous,


 


J'ai un petit soucis avec une appli coreData. La structure de données étant complexe, je n'utilise pas les bindings (j'ai essayé, mais j'ai eu des problèmes comme dirait l'autre). Donc, une tableView est peuplée via une dataSource.


 


Mon soucis : comment techniquement utiliser les "sortDescriptors" à  la manière des NSArrayControllers "bindé", c'est à  dire comment gérer le fait qu'un clic sur un header de la table modifie les sorts Descriptors ?


 


Je n'ai pas retrouvé l'info dans la doc, mais j'ai surement mal cherché comme dirait ma femme...


 


Réponses

  • Pour une colonne nommée "nom" j'ai fait :



    NSSortDescriptor* descriptor=[[NSSortDescriptor alloc] initWithKey:@nom ascending:YES];
    [oTableView setSortDescriptors:[NSArray arrayWithObject:descriptor]];
    [descriptor release]; 
  • MickMick Membre

    Ok mpergand, et merci de ta réponse. Ca d'accord, mais comment gérer les "clics" sur les header pour changer l'ascendance etc.. ?


  • mpergandmpergand Membre
    avril 2013 modifié #4

    Si tu as installé un descriptor, la petite flèche apparaà®t dans la colonne spécifiée.


     


    Tu peux aussi le faire directement dans IB en sélectionnant la colonne et en remplissant le champ "Sort Key" (dans mon cas "nom")


  • MickMick Membre

    dans mon awakeFromNib de mon controleur qui gère la table :


     
    NSSortDescriptor *newSortNom=[NSSortDescriptor sortDescriptorWithKey:@lEleve.nom ascending:YES];
    NSSortDescriptor *newSortPrenom=[NSSortDescriptor sortDescriptorWithKey:@lEleve.prenom ascending:YES];
    [tableNotes setSortDescriptors:[NSArray arrayWithObjects:newSortNom,newSortPrenom,nil]];

    Les "petites flèches" n'apparaissent pas.

  • Regarde ce tuto, ça parle de core data et de tri de colonnes:


    A Core Data Tutorial Part 2: Polishing the Basics


  • MickMick Membre

    Merci pour le lien.


     


    J'ai testé des choses, et j'ai compris que chaque tableColumn doit avoir un sortDescriptorPrototype.


    Via IB, impec, cela fonctionne. 


    Par le code, je créee un descriptor et envoie le message [laColonne setSortDescriptorPrototype:descriptor], mais dans ce cs, ke choix que j'ai fait (ascending YES ou ascending NO) est "figé". Un clic sur le header de la colonne ne change pas le sens....


  • MickMick Membre

    Grrr. Je ne comprends pas comment faire à  la main ce qu'on fait dans IB en remplissant "Sort Key" !!


    Le tri fonctionne, mais impossible de changer le sens, alors que lorsque la manip est faite dans IB, on peut changer le sens, même si initialement il était "acsending". Un détail m'échappe, mais je ne sais pas lequel. Je ne trouve pas dans la doc.

  • Il doit manquer ça:



    - (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
    {
    self.data = [self.data sortedArrayUsingDescriptors:sortDescriptors];
    [aTableView reloadData];
    }

    This method will get fired each time a column header is clicked, and NSTableColumn shows a nice little triangle showing the sorting order.
  • Merci mPergand.


     


    Mais ce que je ne comprends pas, c'est que via IB, le tri fonctionne nikel => la "sort Key" est définie dans le champ, j'ai bien le triangle qui apparait et qui "toggle", la mise à  jour se fait parfaitement bien.


     


    Mais, les colonnes que j'ai créées à  la main et insérées dans la tableView ne se comportent pas de la même façon. Je dois oublier quelque chose dans l'initialisation, ou bien c'est le sortDescriptorPrototype qui pose problème... Je ne vois pas. 


     


    Je vais faire à  la main je pense, en interceptant la méthode déléguée mouseDownInHeaderOfTableColumn.


  • C'est bon !!


    Merci à  Laudema et à  toi MPergand.


     


    en fait, je cherchais compliqué là  où c'était simple... J'utilisais un arrayController intermédiaire, qui ne servait en fait à  rien et qui interférait avec les sortDescriptors de la table. Bref, c'était un peu le merdier. J'ai revu au propre avec vos conseils, et cela fonctionne très bien.


     


    Pour ce qui auraient des soucis de tris, losqu'on crée une colonne par le code, il faut bien spécifier un sortDescriptorPrototype pour qu'elle devienne "sortable". Ensuite, soit un NSArrayController + Bindings gère, soit une dataSource dans laquelle on implémente la méthode qu'à  indiqué mpergand


    - (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
    {
    self.data = [self.data sortedArrayUsingDescriptors:sortDescriptors];
    [aTableView reloadData];
    }



     


    Bonne nuit !


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