Suppression de données dans une NSTableView

odjauodjau Membre
15:17 modifié dans API AppKit #1
Salut tout le monde, une ch'tit question facile  :o

J'ai une tableView avec un bouton "add" et un bouton "remove". J'aimerais remplacer l'action du bouton "delete" par une action sur la touche "retour arière". Comment je fais ::)

Je pensais utiliser la methode keyDown, mais comment detecter la touche "retour arière" ???

Merci d'avance

Réponses

  • cbrandtcbrandt Membre
    15:17 modifié #2
    dans IB tu as un pop-up menu (dans les propriétés du bouton) pour choisir le raccourcis-clavier du bouton
  • odjauodjau Membre
    15:17 modifié #3
    dans 1109080335:

    dans IB tu as un pop-up menu (dans les propriétés du bouton) pour choisir le raccourcis-clavier du bouton

    Je sais  ;D mais j'aurais voulu supprimer le bouton de l'interface. Je trouve que moins il y a de boutons plus c'est clair.
    Je peux faire comme tu dis et cacher mon bouton, mais si ça marche, je trouve pas ça très "propre". Y a t'il une autre solution ?
  • cbrandtcbrandt Membre
    février 2005 modifié #4
    le pb c'est que les événement clavier arrivent au firstResponder, c'est-à -dire le dernier élément cliqué qui accepte d'être keyView (j'espère que je ne raconte pas n'importe quoi :) )...

    donc ça me semble difficile de récupérer ton événement clavier, à  moins qu'il n'y ait aucun objet dans ta fenêtre qui accepte des événements clavier, auquel cas je pense que la fenêtre elle-même va recevoir l'événement... tu pourrais éventuellement la surcharger dans ce cas.

    d'un autre côté, la solution de cacher l'objet avec setHidden l'empêchera de recevoir ton événement... peut-être qu'en le plaçant derrière un autre en ou définissant sa taille à  0 pixels ?

    cepandant je t'avoue que je ne suis pas super spécialiste de la responder chain

    [edit]
    bon je divague complètement, moi...
    je viens de relire ton 1er post, et en fait le plus simple serait peut-être de surcharger ta tableview et récupérer le keydown à  ce moment là  dans
    - (void)keyDown:(NSEvent *)theEvent
    si c'est la touche delete tu fais ton action, sinon tu fais [super keyDown: theEvent]

  • odjauodjau Membre
    15:17 modifié #5
    Salut cbrandt, je viens juste de trouver le temps d'essayer de mettre en oeuvre ta proposition, et une petite question me tarabuste.
    Quand tu parle de surcharger la tableView en quoi cela consiste t-il plus précisément ?
    Suis-je sur la bonne piste si je crée une sous-classe à  partir de NSTableView ???
  • cbrandtcbrandt Membre
    15:17 modifié #6
    dans 1109195444:

    Suis-je sur la bonne piste si je crée une sous-classe à  partir de NSTableView ???

    exactement ! par exemple quelque chose comme ça:
    MaSuperTableView.h:
    <br />#import &lt;cocoa/cocoa.h&gt;<br />@interface MaSuperTableView : NSTableView<br />{<br />}<br />@end<br />
    

    MaSuperTableView.m:
    <br />#include &quot;MaSuperTableView.h&quot;<br /><br />@implementation MaSuperTableView<br /><br />- (void)keyDown:(NSEvent *)theEvent<br />{<br />    if (mettre le test ici pour voir si c&#39;est la touche retour arrière, regarder dans la doc sur NSEvent et NSResponder)<br />   {<br />       // effacer la ou les ligne(s) sélectionnée(s)<br />    }<br />    else<br />       [super keyDown: theEvent];<br />}<br /><br />@end<br />
    


    bien sûr, dans IB, il faut lui dire que ta tableview est de type MaSuperTableView et pas NSTableView...
  • odjauodjau Membre
    15:17 modifié #7
    o:)
    Je mes ça en oeuvre dès ce soir. Mon boss n'appprècierai pas forcément que je test ça au boulot  ;)

    Merci
  • odjauodjau Membre
    15:17 modifié #8
    Bon ça avance, mais à  petits pas  :-\\

    J'ai créé ma sous-class, implémenté le code proposé et vérifié que je passe bien dans le if lors que j'appuie sur la touche retour arrière de mon clavier.
    La ou je coince, c'est dans le code pour effacer les lignes sélectionnées.  :'( Je n'est pas trouvé le moyen d'appeler le code qui ce trouve dans mon "appController.m". Y à  bien moyen de le faire non  :why?:
  • cbrandtcbrandt Membre
    15:17 modifié #9
    ton appcontroller est de delegate de l'application ?

    <br />ctrl = [[NSApplication sharedApplication] delegate];<br />
    


    ton appcontroller est de delegate de la fenêtre ?

    <br />ctrl = [[self window] delegate];<br />
    


    voilà  voilà 
  • mpergandmpergand Membre
    15:17 modifié #10
    Salut ptit bras,

    Que se passe-t-il lorsque la cellule sélectionnée change, NSTableView appelle la méthode déléguée adéquate pour prévenir le delegate de ce changement. La situation est identique ici, sauf que c'est toi le maà®tre d'½uvre (sous classe). Donc tu dois définir une nouvelle méthode (ex: deleteCellAction ou deleteKeyPressed) et appeler cette méthode.


    SEL delSelector=NSSelectorFromString(@deleteKeyPressed);
    id delegate=[self delegate];
    [delegate performSelector: delSelector withObject: nil];


    avec withObject tu peux passer un paramètre quelconque, par ex le no de la cellule à  effacer.
    Il est aussi conseillé de tester si la méthode existe et de lancer une exception, afin de mieux contrôler les choses   ;)
  • odjauodjau Membre
    15:17 modifié #11
    Y a un truc qui m'échappe ???
    [self delegate] me renvoie (null) :-\\

    Ou j'ai merdu ?
  • cbrandtcbrandt Membre
    15:17 modifié #12
    dans IB, tu n'as relié que l'outlet 'data source' vers ton window controller; fais la même chose avec l'outlet 'delegate' et ça ira mieux...
  • ClicCoolClicCool Membre
    février 2005 modifié #13
    dans 1109361737:

    Y a un truc qui m'échappe ???
    [self delegate] me renvoie (null) :-\\
    Ou j'ai merdu ?


    Bein ça s'exécute où ton [self delegate] ?
    Une sousclasse perso de NSTableView ayant déclaré son delegate (comme suggère mpergand) ?
    Es tu sur d'avoir déclaré le délegate de ta tableView ?

    Parceque si ton intance l'exécutant (self) n'a pas de délégate c'est normal que ça te renvoie null.

    Ou alors si le delegate recherché est celui d'une fenetre ou de l'appli mieux vaut alors faire comme suggère cbrandt.

    [EDIT] grilled par y'a bon,
    mais que font les notifications ?
  • fouffouf Membre
    15:17 modifié #14
    On peut pas recuperer le delegate de la super-classe en faisant [super delegate] ??
    La methode utilise par ClicCool et cbrandt marche-t-elle meme si la sous-classe n'implemente pas la methode delegate ?? Si oui, pourquoi ?
  • ClicCoolClicCool Membre
    15:17 modifié #15
    Deux raisons:

    1 °) Parce qu'en sous classant on a pas surchargé la méhode "delegate" et donc que c'est l'implémentation de super qui sera alors appelé et c'est là  ce qu'il faut :)

    2 ° Parcequ'on a surchargé la méthode "delegate" et alors on devait savoir pourquoi on le faisait (on espère) et c'est alors la méthode surchargée (de l'instance de la sous classe) qui est appelée et c'est là  encore ce qu'il faut ;).
  • mpergandmpergand Membre
    15:17 modifié #16
    dans 1109364554:

    La methode utilise par ClicCool et cbrandt marche-t-elle meme si la sous-classe n'implemente pas la methode delegate ?? Si oui, pourquoi ?

    NSTableView comme NSControl et ses dérivés implémentent setDelegate/delegate
    Si ça n'avait pas été le cas on aurait pu utiliser une notification.
  • odjauodjau Membre
    15:17 modifié #17
    Merci tous le monde, ça marche !!!  :brule:
    Effectivement j'avais oublié de connecter l'outlet delegate de ma tableView dans IB :o (pourtant j'en avais essayée des tas d'autre  :'( )

    @+ ; o:)
  • wiskywisky Membre
    15:17 modifié #18
    dans 1109324837:

    ton appcontroller est de delegate de l'application ?

    <br />ctrl = [[NSApplication sharedApplication] delegate];<br />
    


    ton appcontroller est de delegate de la fenêtre ?

    <br />ctrl = [[self window] delegate];<br />
    


    voilà  voilà 


    où met-tu ses lignes? c'est quoi ctrl?

    Je sais je pose des questions bête ;)
Connectez-vous ou Inscrivez-vous pour répondre.