[binding] Tri d'une TableView et de ses données liées

21:13 modifié dans API AppKit #1
Bonjour à tous et je suis heureux de trouver un tel forum  :)

J'ai un petit souci avec une NSTableView dont le contenu est généré par un "Binding" sur ses colonnes (la méthode classique que l'on trouve dans de nombreuses docs sur le sujet).
Ma Table View contient bien les informations de mon tableau d'objets, je peux ajouter/modifier/supprimer des éléments sans soucis mais là où cela se passe mal, c'est lorsque je clique sur l'en tête d'une colonne pour la trier. Visuellement, le tri est effectué mais le tableau qui contient les données n'est pas trié. Ce qui fait que l'affichage et les données ne sont plus "synchro". Dans la pratique, lorsque je veux avoir les infos de l'élément [MonTableau objectAtIndex:[MaTable selectedRow]], je n'obtiens pas le bon objet.

Quelqu'un à une solution à proposer ?

Merci :)


Réponses

  • TiffTiff Membre
    21:13 modifié #2
    Je n'ai pas la réponse, mais ton problème m'intéresse car je vais bientôt y être confronté.
    Comment gères-tu le tri ? Avec les bindings ? Peux-tu indiquer exactement comment tu as procédé ?
  • TiffTiff Membre
    21:13 modifié #3
    En attendant, es-tu allé voir là : http://cocoa.mamasam.com/COCOADEV/2003/12/2/80309.php ?
  • 21:13 modifié #4
    dans 1085348216:

    En attendant, es-tu allé voir là : http://cocoa.mamasam.com/COCOADEV/2003/12/2/80309.php ?


    Merci pour ce lien :)
    En fait, je pensais qu'il était possible de ne pas avoir à utiliser la fonction du "delegate" pour mettre à jour l'ordre du mon NSArray. Je croyais en enffet que le binding pouvait le faire.
    Mais je viens de réaliser mon erreur :D En effet, même si je remplis mon tableau par le binding, ce dernier ne traite qu'un objet à la fois. Il n'a donc aucune notion de l'ordre du tableau.

    Par contre, il y a un truc qui me chiffonne  ??? La solution donnée passe par un "delegate" de l'obet dataSource. Ce qui signifie que je dois rajouter sa gestion dans ma tableView (avec par exemple les delegates comme numberOfRows:). Cela ne fait il pas double emploi et ne surcharge pas l'application pour rien  (vu que le binding fait déjà cette gestion) ?


  • TiffTiff Membre
    21:13 modifié #5
    Je n'ai pas testé. Il me semblait que les bindings permettaient de s'affranchir de ce type de problème.
    J'ai commencé à regarder la doc Apple, mais je n'ai rien trouvé de concluant. ...tonnant qu'il faille repasser par le delegate pour une opération aussi simple que le tri. Il me semble que ce n'est pas dans l'esprit des bindings. Que les Model donnent leurs propres critères de tri, d'accord, mais que MyDocument s'en mêle me gêne. NSArrayController doit pouvoir prendre le relais. J'étudie ça ce soir.
  • TiffTiff Membre
    21:13 modifié #6
    Bon, apparemement, il y a deux façons de trier des données.
    On peut effectuer des tris sur une liste NSArray maListe en créant une deuxième liste maListeTriee et en utilisant par exemple les SortDescriptors (maListeTriee = [maListe sortedArrayUsingDescriptors: sortDescriptors] )
    On peut effectuer des tris dans une NSTableView avec bindings sans rien coder. Il suffit de cliquer sur les flèches dans les en-têtes des colonnes.

    Dans les deux cas, la liste initiale maListe n'est pas modifiée !!!
    Dans le premier, on crée une deuxième liste maListeTriee et on peut éventuellement remplacer maListe par maListeTriee.
    Dans le deuxième, c'est InterfaceBuilder qui s'occupe lui-même des tris. Je pense qu'il crée une deuxième liste IBListeTriee qu'il affiche ensuite dans la TableView. Contrairement au premier cas, nous n'avons pas accès à IBListeTriee et nous ne pouvons pas accéder directement, par exemple, à l'objet de la deuxième ligne du tableau.

    Mes conclusions après deux heures de recherche :
    Si on veut absolument avoir une NSArray triée, il doit falloir coder.
    Si l'on ne veut que la TableView triée, aucune ligne de code, IB via binding, ArrayController et TableViewColumn s'occupe de tout.

    Si quelqu'un peut apporter des compléments, je suis preneur !
  • TiffTiff Membre
    21:13 modifié #7
    Tien, bizarre, ma TableView refuse de se trier quand je clique sur la deuxième colonne. Ya encore du boulot !
  • mai 2004 modifié #8
    dans 1085434436:


    Mes conclusions après deux heures de recherche :
    Si on veut absolument avoir une NSArray triée, il doit falloir coder.


    Aà”e, on arrive aux même conclusions... Et c'est pas très cool car cela signifie qu'à chaque clique sur un titre de colonne, il y a 2 tris: celui de la tableView et celui que l'on doit faire dans le tableau de données  :(
    A moins qu'il soit possible de faire directement le tri du tableau lors d'un clique sur le titre de la colonne (je pense à setDoubleAction de la NSTableView).
    Arrrgggg... pourquoi je n'ai pas mon mac sous la main pour tester cette voie!!
  • TiffTiff Membre
    21:13 modifié #9
    J'ai le sentiment que si tu passes par ArrayController, tu as intérêt de tout lui laisser faire.
    Pour l'appli que je suis en train de coder, j'ai ajouté un tiroir dans lequel on retrouve dans des TextField la plupart des informations figurant dans la table, + quelques unes (en fait mon tiroir me sert d'inspecteur).
    Ainsi, si je dois récupérer des infos sur la ligne sélectionnée, c'est dans les TextField que je vais les chercher.
    Du coup, je n'ai jamais besoin de toucher à NSArray. ArrayController s'occupe de tout (tri et recherches inclus).
  • nucleusnucleus Membre
    21:13 modifié #10
    dans 1085312923:
    Visuellement, le tri est effectué mais le tableau qui contient les données n'est pas trié. Ce qui fait que l'affichage et les données ne sont plus "synchro".


    Je peux pas vraiment répondre au problème, car j'ai pas encore expérimenté les bindings et les sort descriptors..
    Mais comme Tiff, je pense que c'est le rôle du NSArrayController de gérer tout ca..

    Par contre il faut garder à l'esprit que la vue ne va jamais modifier le modèle, qu'elle n'est qu'une représentation (table pas triée, table triée, graphique, je ne sais quoi encore) du modèle..

    Ce n'est pas forcement une bonne idée de voiloir trier ton NSArray selon ta table..

    Imagine que tu ais deux tables (vue) du même NSArray (modèle) à l'écran, alors tu dois pouvoir avoir un tri differents dans chaque table...
  • ClicCoolClicCool Membre
    mai 2004 modifié #11
    Bonjour à tous,
    ravis de voir la communauté Cocoa Francophone s'enrichir.:)
    Pour ce qui est des tris de tables gérées par un NSArrayController, je n'ai jamais eu l'occasion de vérifier, mais il me semble qu'on trouvera tous les objets (ou leur référence vers le Modèle ?) sagements triés dans le NSArray nommé ArrangedObjects du controleur(auquel nous avons du reste lié la NSTableView).
    Rappelons nous que si le Controlleur est lié à un ModelObject pour son contenu, la TableView, elle, n'est pas liée au modèle mais aux arrangedObjects du controleur. Entre les deux le contrôleur fait sa tambouille pour les tris.
    S'il est utile de connaà“tre les index des objets triés; il doit suffir ici d'avoir un IBOutlet pointé sur le NSArrayController: monArrayControleur et d'appeler:
    NSArray *tableauTrié = [monArrayControleur arrangedObjects];
    (doc des NSArrayController de Application Kit).
    J'espère avoir aidé
    ClicCool :)
Connectez-vous ou Inscrivez-vous pour répondre.