Drag and drop dans NSTableView avec custom cell

olofolof Membre
12:07 modifié dans API AppKit #1
Salut !

J'ai donc une tableview, avec une seule colonne. Cette colonne contient des cellules custom (j'y affiche quelques images, et plusieurs lignes de texte). J'aimerais utiliser le drag and drop pour que l'utilisateur puisse gérer lui-même l'ordre des lignes. Pour info, ma table est remplie par les bindings, avec un NSArrayController. Pour commencer plus simplement, j'ai pu implémenter le drag and drop dans une autre table view, aussi remplie par les bindings, mais contenant des cellules "normales" (du texte quoi). Et ça fonctionne. Je fais la même chose avec ma table faite de cellules customs et là , rien ne se passe. La méthode qui est censé être appelée au début du processus ne l'est même pas. Est-ce que je suis bon pour coder plein de choses moi-même pour pouvoir faire ça ?

Merci !

PS: Si mon explication n'est pas assez complète, dites-moi ce qu'il manque !!!

Réponses

  • olofolof Membre
    12:07 modifié #2
    Je me réponds à  moi-même, il faut que la custom cell implémente la méthode :

    - (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView {<br />
    


    Et retourne la constante adéquate.

    Par contre, mon problème maintenant est que tout ça fonctionne assez bien. En résumé, j'ai ajouté un attribut 'ordre' à  mon entité. Quand je modifie l'ordre par un drag and drop, je mets à  jour cet attribut pour tous mes objets. Et bien entendu, le tri du tableau se fait sur cet attribut.

    Quand je drop une custom cell, l'attribut se met bien à  jour, par contre, à  l'écran, rien ne se passe. Comme si le tableau n'était pas mis à  jour. J'ai essayé de le forcer en faisant un rearrangeObjects sur mon array controller, mais ça ne change rien. Je suis obligé de quitter l'appli et de la relancer pour voir l'ordre juste.

    Une idée ?
  • olofolof Membre
    12:07 modifié #3
    Allez, je repose mon problème, en espérant attirer un peu de monde, parce que là , je suis bloqué !

    Donc, une entité core-data (Tache) avec quelques attributs pas très importants et un attribut 'ordre' plus important (c'est du numérique). Mon but est d'utiliser cet attribut pour ordrer ma NSTableView qui affiches mes Taches. Ma NSTableView est constituée de cellules custom.

    J'ai donc un tri qui est "instancié" à  l'initialisation de l'appli sur cet attribut. Jusque là , ça fonctionne. Après, j'ai autorisé le drag and drop, qui fonctionne pas mal aussi. A savoir que la cellule "draggé" suit la souris et quand je la lâche ailleurs dans le tableau, je récupère bien l'index de ma cellule déplacée ainsi que l'endroit où je la pose.

    Les méthodes qui servent au drag and drop, je les ai mises dans ma classe qui étend le NSArrayController qui sert de source à  ma NSTableView. Dans IB, cette classe est déclarée comme étant DataSource et Delegate de ma NSTableView.

    Dans la méthode "finale" de gestion du drag and drop, je mets à  jour l'attribut ordre de toutes mes tâches et je demande à  mon NSArrayController de rearranger tout ça. Et là , rien ne se passe.

    Par contre, mon modèle est bien correct. Si j'affiche dans ma cellule custom l'attribut ordre, il est bien modifié. Par contre la NSTableView elle n'est pas mise à  jour.

    Si quelqu'un a une piste, c'est volontiers. Je ne sais plus quoi faire !


    Merci !


    PS: Projet à  disposition sur demande, si quelqu'un a le temps !!!!
  • olofolof Membre
    12:07 modifié #4
    Bon, j'ai fait la même chose, avec une table plus simple (pas de cellules custom), avec un entité plus simple et ça fonctionne...

    Dans mon projet qui ne fonctionne pas, le pire est que une fois que j'ai modifié l'attribut ordre de toutes mes tâches, si je redemande à  mon NSArrayController de me renvoyer les objets ordrés (arrangedObjects), ils ne le sont pas ! Comme dit précédement, l'attribut ordre a bien sa nouvelle valeur, mais pas l'ombre d'un tri.
    Et si je demande à  mon NSArrayController sur quoi il trie, il me répond bien que la clé est "ordre" !!!

    Une piste pour savoir d'ou ça pourrait provenir ? Je ne sais plus quoi faire !
  • CéroceCéroce Membre, Modérateur
    12:07 modifié #5
    Je vais peut-être écrire une connerie, mais as-tu appelé -[NSArrayController rearrangeObjects] pour qu'arrangedObjects soit mis à  jour ? Mais peut-être as-tu utilisé setAutomaticallyRearrangesObjects:?
  • olofolof Membre
    12:07 modifié #6
    dans 1221024328:

    Je vais peut-être écrire une connerie, mais as-tu appelé -[NSArrayController rearrangeObjects] pour qu'arrangedObjects soit mis à  jour ? Mais peut-être as-tu utilisé setAutomaticallyRearrangesObjects:?


    J'ai bien appelé [NSarrayController rearrangeObjects], malheureusement....  :'(
  • olofolof Membre
    12:07 modifié #7
    Si quelqu'un est motivé pour jeter un coup d'oeil à  mon projet, il est à  disposition. Et si il faut des explications, ça sera très volontiers ! Ca fait un moment que je suis bloqué !

    Merci !


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