Cliquer dans une NSTableView sans sélectionner

J'ai une TableView qu'il n'est "sélectionnée".


Si je clique dedans, d'une part il "sélectionne" cette TableView mais en plus, directement, il sélectionne la ligne sur laquelle j'ai cliqué.


 


Je voudrais que le comportement soit différent : 


- que le premier cliquer rende active la TableView


- que seulement le clic suivant sélectionne une ligne.


 


Est-ce possible/facile ?


 


Merci !


Réponses

  • AliGatorAliGator Membre, Modérateur
    Posté dans la mauvaise section, on sait pas si tu parles de UITableView ou NSTableView (qui n'ont pas du tout le même look / comportement sous iOS et OSX...)
  • Il existe une méthode de NSView qui pourrait te convenir:


     


    - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent


     


    Il faut sous classer NSTableView.


  • @Ali :


    Oui, c'est un sujet OSX plus que iOS.


     


     


    @mpergand


    J'avais hélas peur qu'il faille sous-classer NSTableView...


    Vu que les NSTableView sont presque toujours créés via IB, je me dis que ça doit être horrible d'utiliser un sous-classe de NSTableView. L'as-tu déjà  fait ? 




  • Vu que les NSTableView sont presque toujours créés via IB, je me dis que ça doit être horrible d'utiliser un sous-classe de NSTableView. L'as-tu déjà  fait ? 




     


    Pourquoi horrible ?


    Dans IB tu changes le nom de la classe pour les tableViews concernées.


    Tu n'as pas besoin de modifier quoi que ce soit dans tes fichiers sources.



  •  


    Dans IB tu changes le nom de la classe pour les tableViews concernées.




     


    Je ne savais pas que c'était possible ! 


    Merci !

  • colas_colas_ Membre
    septembre 2013 modifié #7

    J'ai essayé ceci :



    #import "CBDOutlineView.h"

    @implementation CBDOutlineView


    - (BOOL)needsPanelToBecomeKey
    {
    DDLogDebug(@AAA) ;

    return YES ;
    }

    - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
    {
    DDLogDebug(@BBB);
    return NO ;
    }

    - (void)drawRect:(NSRect)dirtyRect
    {

    DDLogDebug(@CCC);

    [super drawRect:dirtyRect] ;
    }

    @end

    La méthode acceptsFirstMouse est appelée quand je clique dans ma OutlineView alors que la fenêtre n'est pas active.


     


    Je voudrais un comportement similaire lorsque je clique dans la OutlineView alors qu'une autre vue de cette même fenêtre était sélectionnée.


  • Faire un test dans mouseDown ?



    void mouseDown:(NSEvent*) event
    {
    if([[self window] firstResponder]!=self)
    {
    [[self window] makeFirstResponder:self]
    return;
    }

    [super mouseDown:event];
    }

  • En fait, 


    il semble que dans le test que tu proposes, on est toujours le firstResponder !!


    Autrement dit,



    [[self window] firstResponder] != self

    répond toujours NO.


  • colas_colas_ Membre
    septembre 2013 modifié #10

    Finalement, je m'en suis sorti ajout un BOOL qui code si je viens de devenir le firstResponder.


     


    Remarquez qu'on a besoin d'un setNeedsDisplay.



    // le .h


    #import <Cocoa/Cocoa.h>

    @interface CBDTableView : NSTableView

    @end




    // le .m

    @interface CBDTableView()

    @property (nonatomic) BOOL isReadyForSelection ;

    @end


    @implementation CBDTableView

    - (BOOL)becomeFirstResponder
    {
    self.isReadyForSelection = NO ;

    return YES ;
    }



    - (void) mouseDown:(NSEvent*) event
    {

    if (self.isReadyForSelection)
    {
    [super mouseDown:event];
    }
    else
    {
    [[self window] makeFirstResponder:self] ;
    self.isReadyForSelection = YES ;
    [self setNeedsDisplay];
    }
    }
    @end


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