[IB] Bouton avec sous menu

GrmGrm Membre
20:45 modifié dans Xcode et Developer Tools #1
Bien le bonjour à  tous  !

J'ai besoin de votre aide après quelques heures perdues dans les tréfonds de l'interweb. Je suis à  la recherche de LA solution qui me permettrait d'avoir un bouton qui avec un clique effectue une action et avec un appui long affiche un menu d'actions pouvant être réalisées.

Un peu comme pour ce bouton d'Xcode 4 :
capturedcran20110405213.th.png


ici : http://pommedev.mediabox.fr/utilisation-des-classes-cocoa/bouton-avec-menu/
là  : http://pommedev.mediabox.fr/utilisation-des-classes-cocoa/bouton-speciaux/
ou encore là  : http://pommedev.mediabox.fr/utilisation-des-classes-cocoa/nsmenu-sur-nsbutton/

En farfouillant sur le forum j'ai deja trouver quelques sujet à  ce propos mais à  chaque fois la solution proposée en pièce jointe n'est plus accessible.

Donc si vous avez le moindre truc pour m'aider je prend

Réponses

  • 20:45 modifié #2
    NSButton-> setMenu:
    NSMenuItem permet de foutre un titre, une image, et d'associer tout ça à  une belle action à  laquelle sera censé répondre une target.
  • GrmGrm Membre
    20:45 modifié #3
    Merci c'est parfait ! 

    Par contre pour faire apparaitre le menu il faut que je passe par le code ou pas, ça me fait pas peur mais si ça peut-être fait magicalement (je sais c'est pas dans un dico mais ça faite awesome)
  • 20:45 modifié #4
    Par défaut c'est en clique-droit.
    Si tu veux que ça soit fait en clique-gauche, 2 solutions:
    • Sous-classe de NSButton afin de surcharger le sendEvent:
    • Ou simplement faire apparaitre le menu manuellement l'action du bouton avec une méthode de NSMenu du style displayAtLocation.....
  • GrmGrm Membre
    20:45 modifié #5
    Merci pour ta réponse !

    Au final j'ai choisi de sous classer NSButton pour afficher le menu en cas d'appui long sur le bouton.

    En fouillant sur le forum j'ai trouvé une méthode :
    • au mouse down je met un bool a true, il est mit a faux au mouseUp
    • en même temps j'appelle performSelector: withObject: afterDelay: qui appelle ma méthode d'affichage du menu
    • dans ma méthode d'affichage de menu je test si mon bouton est toujours pressé


    Mais tout ceci ne s'effectue que lorsque je relâche le bouton de la souris. D'ou peut venir le souci d'apres toi ?

    Mon code :
    <br />- (void) showMenu:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; if(pressed)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;on est arrivé jusqu&#039;ici youpi !&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; [NSMenu popUpContextMenu:[self menu] withEvent:theEvent forView:self];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />}<br /><br />- (void)mouseDown:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; [super mouseDown:theEvent];<br />&nbsp; &nbsp; NSLog(@&quot;Coucou Down mon menu est : %@&quot;, [self menu]);<br />&nbsp; &nbsp; pressed = true;<br />&nbsp; &nbsp; [self performSelector:@selector(showMenu:) withObject:theEvent afterDelay:1];<br />&nbsp; &nbsp; [self mouseUp:theEvent];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />}<br /><br />- (void)mouseUp:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; [super mouseUp:theEvent];<br />&nbsp; &nbsp; NSLog(@&quot;Coucou mon menu est : %@&quot;, [self menu]);<br />&nbsp; &nbsp; pressed = false;<br />}<br />
    
  • GrmGrm Membre
    20:45 modifié #6
    Bon au final j'ai peut-être trouver d'ou venais le souci dans ma méthode mouseDown: j'appelé la méthode [super mouseDown:] il semblerait que cela modifie le comportement.

    Je l'ai retiré et ça marche. Mais si quelqu'un peut m'expliquer le pourquoi du comment je me coucherais moins bête ce soir
Connectez-vous ou Inscrivez-vous pour répondre.