[Résolu]Drag & drop entre 2 NSTableView

UniXUniX Membre
septembre 2005 modifié dans API AppKit #1
Salut.

Ca fait 3 heures que je rame à  comprendre le fonctionnement du drag & drop, particulièrement entre 2 NSTableView .... :(  Je commence à  avoir un sacré mal de tête, et en + j'embrouille tout ...

Quelqu'un connaitrait un exemple de drag & drop entre 2 tables d'une même window ?

Réponses

  • ChachaChacha Membre
    14:35 modifié #2
    Essaye de consulter ça:
    http://www.objective-cocoa.org/forum/index.php?topic=928.0
    Après, si tu as des questions plus spécifiques...

    +
    Chacha
  • UniXUniX Membre
    14:35 modifié #3
    Merci Chacha.

    Bon, alors petit à  petit je sors la tête du trou.

    Je suis en train d'écrire la méthode (BOOL)tableView:(NSTableView *)tv writeRows:(NSArray*)rows toPasteboard:(NSPasteboard*)pb

    D'ailleurs, je met le code :
    - (BOOL)tableView:(NSTableView *)tv writeRows:(NSArray*)rows toPasteboard:(NSPasteboard*)pb
    {
        NSMutableArray *lignesTableau = [[NSMutableArray alloc] init];
        NSEnumerator *enumerator = [rows objectEnumerator];
        id object;
        NSData *lignesData;
        while (object = [enumerator nextObject]) {
            NSMutableDictionary *ligneSimple = [[NSMutableArray alloc] init];
    //code manquant pour remplir le dictionnaire
            [lignesTableau addObject:ligneSimple];
        }
        lignesData = [self encodeDataRepresentationForObjects:lignesTableau];
        [pb declareTypes:[NSArray arrayWithObjects:@cartes, nil] owner:self];
        return [pb setData:lignesData forType:@cartes];
    }


    Je pense avoir pigé ce qu'il y avait à  faire, mais je n'arrive pas à  voir comment remplir le dictionnaire. Il faut faire un setObject: forKey: pour chaque variable d'instance, c'est bien ça ? Mais comment j'obtient mon objet ?

    On progresse, doucement certes, mais on progresse ....

  • UniXUniX Membre
    14:35 modifié #4
    Bon, je crois que j'ai un truc pas trop mal :
    - (BOOL)tableView:(NSTableView *)tv writeRows:(NSArray*)rows toPasteboard:(NSPasteboard*)pb
    {
        NSMutableArray *lignesTableau = [[NSMutableArray alloc] init];
        NSEnumerator *enumerator = [rows objectEnumerator];
        id object;
        NSData *lignesData;
        while (object = [enumerator nextObject])
    {
    int rang = [object intValue];
            [lignesTableau addObject:["mon tableau" objectAtIndex:rang]];
        }
        lignesData = [self encodeDataRepresentationForObjects:lignesTableau];
        [pb declareTypes:[NSArray arrayWithObjects:@cartes, nil] owner:self];
        return [pb setData:lignesData forType:@cartes];
    }


    Mais je sais pas comment acceder à  mon tableau qui rempli la NSTableView. Dans mon code, c'est là  ou j'ai mis "mon tableau". Il faut mettre quoi ?
  • ChachaChacha Membre
    14:35 modifié #5
    dans 1126811980:

    Mais je sais pas comment acceder à  mon tableau qui rempli la NSTableView. Dans mon code, c'est là  ou j'ai mis "mon tableau". Il faut mettre quoi ?

    Normalement, ça devrait être [tv dataSource];
    ça marche avec ça ?
    Sinon, tu es sous 10.4 ou sous 10.3 ? Sous 10.4 il ya des nouvelles fonctions sympa qui pourraient te permettre de simplifier ton code.

    +
    Chacha
  • UniXUniX Membre
    14:35 modifié #6
    Bon, j'ai résolu le pb. Comme j'utilisait les bindings, et que ça me posait plus de problème qu'autre chose, je suis revenu à  du plus classique.

    J'ai mon drag qui marche, mais j'ai un petit problème pour le drop.

    Bon, un petit problème pour le drop.

    Lors du drag, j'ai encodé la tableau contenant les objets de la façon suivante :
    lignesData = [NSKeyedArchiver archivedDataWithRootObject:lignesTableau];

    ou lignesData est un NSData (celui que je place ensuite dans le pastboard), et lignesTableau est un NSMutableArray.

    Pour le drop, je décode de la façon suivante :
    NSData *lignesData = [pboard dataForType:@cartes];
    NSMutableArray *lignes = [NSUnarchiver unarchiveObjectWithData:lignesData];


    Mais là  j'ai le message d'erreur suivant :
    +[NSUnarchiver unarchiveObjectWithData:]: extra data discarded


    J'ai vérifié dans le débugger, l'objet NSData au départ et à  l'arrivée fait la même taille (711 bytes pour une ligne).
  • ChachaChacha Membre
    14:35 modifié #7
    dans 1126946934:

    lignesData = [NSKeyedArchiver archivedDataWithRootObject:lignesTableau];

    NSMutableArray *lignes = [NSUnarchiver unarchiveObjectWithData:lignesData];


    Messages typique quand on a encodé avec un Keyed archiver et désencodé avec un pas-Keyed unarchiver... comme c'est les cas ici.
    remplace donc NSUnarchiver par NSKeyedUnarchiver

    +
    Chacha

    PS :chapeau pour t'être dépatouillé avec les drag'n drop ! c'est pas évident.
  • UniXUniX Membre
    14:35 modifié #8
    Super Chacha, c'était bien ça ....  <3 <br />Merci beaucoup.

    J'ai réussi par me sortir du drag & drop (je suis content :adios!:), mais grâce à  beaucoup d'aide et de temps ....!
Connectez-vous ou Inscrivez-vous pour répondre.