[Résolu]changer texte d'un bouton en cour d'utilisation

prepa75prepa75 Membre
mars 2010 modifié dans API AppKit #1
Bonjour à  tous,

je me posais un petit défi  : changer le texte écrit sur un bouton durant l'utilisation de l'application...

je vous donne un exemple concret :

j'ai un bouton "commencer" qui comme son nom l'indique lance une opération. je souhaite que ce même bouton soit renommé "correction" une fois que l'on a cliqué dessus.

j'ai un peu bidouillé et j'en suis venu a créer un bouton vierge sur lequel j'y colle un label,et avec un NSString je renomme le bouton.
j'étais fier de ma trouvaille jusqu'a ce qu'il faille cliquer sur le dit bouton  :( le label avait pris toute la place et je ne pouvais pas cliquer...

si quelqu'un a une idée je suis preneur.

Réponses

  • CéroceCéroce Membre, Modérateur
    19:55 modifié #2
    Utilise plutôt la méthode -[NSButton setTitle:].
  • mpergandmpergand Membre
    19:55 modifié #3
    Dans IB, pour le button, choisir un type autre que Push Button (rounded, square) et remplir les champs Title et Alternate Title.

    Et voilou  :)
  • prepa75prepa75 Membre
    19:55 modifié #4
    dans 1268835675:

    Utilise plutôt la méthode -[NSButton setTitle:].


    voici mon code :

    - (void)changebutton:(NSString *)textbutton<br /><br />{<br />if(comptnbcoup == 0)<br />	{<br />		NSString *commencer;							<br />		commencer = @&quot;commencer&quot;;								<br />		[textbutton setTitle:commencer];<br />	}<br />	<br />	else if(comptnbcoup != 0)<br />	{<br />		NSString *commencer;							<br />		commencer = @&quot;correction&quot;;								<br />		[textbutton setTitle:commencer];<br />	}<br />	<br />}<br />
    


    et ça ne marche pas car je n'arrive pas a conecter sous IB le bouton au pointeur textbutton.
    ai-je fais une erreur de débutant?

  • prepa75prepa75 Membre
    19:55 modifié #5
    dans 1268836634:

    Dans IB, pour le button, choisir un type autre que Push Button (rounded, square) et remplir les champs Title et Alternate Title.

    Et voilou  :)


    j'ai essayer cette méthode mais ou est-ce que l'on paramètre le choix du texte?
    comment on fait pour expliquer les conditions??

    parsque le bouton reste toujours sur "commencer" , ce qui est logique...
  • ThibautThibaut Membre
    19:55 modifié #6
    Il faut un outlet sur le bouton et non essayer de changer un NSString sortit d'on ne sait où.
    Voici un exemple rapide, non testé :

    Controller.h
    @interface Controller : NSObject {<br />	IBOutlet NSButton *myButton;<br />}<br />- (IBAction)myButtonAction:(id)sender;<br />@end<br />
    


    Controller.m
    @implementation Controller<br />- (IBAction)myButtonAction:(id)sender {<br />	[myButton setTitle:@&quot;Correction&quot;];<br />}<br />@end<br />
    
  • CéroceCéroce Membre, Modérateur
    19:55 modifié #7
    dans 1268837026:

    ai-je fais une erreur de débutant?


    Oui. Tu ne modifies pas la valeur de comptnbcoup. De plus, on le déclarerait plutôt avec un type BOOL.

    Par ailleurs, le prototype de la méthode est forcément:
    [tt]- (IBAction)changebutton:(id)sender[/tt]


    dans 1268837259:

    j'ai essayer cette méthode mais ou est-ce que l'on paramètre le choix du texte?
    comment on fait pour expliquer les conditions??

    Il n'y a pas de conditions. Certains boutons possèdent deux états: relâché (title) ou enfoncé (alternateTitle).
    On fixe ces intitulés sous IB, palette Inspector, 1er onglet.
  • CéroceCéroce Membre, Modérateur
    19:55 modifié #8
    dans 1268837684:

    Il faut un outlet sur le bouton et non essayer de changer un NSString sortit d'on ne sait où.

    Non, ce n'est pas nécessaire. On possède déjà  une référence vers le bouton cliqué par le paramètre sender transmis à  l'action.
    Par contre, il faudra transtyper sender. ( [tt][(NSButton*)sender sendTitle:@Correction];[/tt] )
  • prepa75prepa75 Membre
    19:55 modifié #9
    dans 1268837684:


    Voici un exemple rapide, non testé :



    merci ça marche nikel ^^
  • prepa75prepa75 Membre
    19:55 modifié #10
    dans 1268838113:

    dans 1268837026:

    ai-je fais une erreur de débutant?


    Oui. Tu ne modifies pas la valeur de comptnbcoup. De plus, on le déclarerait plutôt avec un type BOOL.



    en fait comptnbcoup est incrémenté plus loin dans le code.concernant le type BOOL je suis en train de le books, je pense que j'ai compris je vais essayer de l'appliquer...

    concernant altenativeTitle j'avais pas compris que c'étais lors du relachement du bouton.et dans ce cas là  ça ne correspond pas à  ce que je veux faire...mais c'est pas grave car j'ai compris en utilisant un PushButton donc c'est niquel...ptit à  ptit je progresse^^

    prochain défis : utiliser un Level Indicator...

  • AliGatorAliGator Membre, Modérateur
    19:55 modifié #11
    Oui Céroce a raison, on a déjà  le sender. Si on utilise l'IBAction déclenchée par le bouton pour en profiter pour changer le texte dudit bouton.

    Sauf que dans le cas de prepa75, c'est la déclaration de sa méthode [tt]- (void)changebutton:(NSString *)textbutton[/tt] qui pose problème : le code de cette méthode est bon... à  condition que textbutton représente ton bouton, donc un NSButton*, et non pas représente un texte, donc un NSString* !

    Après si tu veux transformer cette méthode en une IBAction pour pouvoir la connecter à  ton bouton, et donc que par la même occasion il change de texte dès que tu cliques dessus, il suffit de remplacer le "void" par "IBAction" dans la déclaration de la méthode (en plus bien sûr d'avoir remplacé le NSString* par un NSButton*) pour que IB reconnaisse que c'est une IBAction et donc te propose de la connecter.

    Si tu mets un NSButton* en paramètre, alors tu n'auras pas à  faire le transtypage dont parle Céroce dans le message précédent, par contre IB ne te permettra de connecter ton action qu'à  un NSButton (puisque tu as dit via la déclaration de ta méthode que le sender, que tu as appelé ici textbutton, doit être un NSButton).
    Si tu mets "id" comme type de paramètre, comme le suggère Céroce, alors IB te permettra de connecter cette action à  n'importe quel type de NSControl, pas que des NSButtons. Mais par contre du coup dans la méthode, il faudra faire le transtypage du coup, pour avoir le droit d'appeler les méthodes comme setTitle, qui sont des méthodes propres à  NSButton... Donc autant indiquer tout de suite que le paramètre est de type NSButton ;)
  • AliGatorAliGator Membre, Modérateur
    19:55 modifié #12
    Pour le alternateTitle, je suis pas sûr de ce que je dis, mais regarde dans IB les différents types de NSButton que tu peux avoir : tu peux choisir qu'il soit "momentary" (affichage type "activé" quand tu appuies, "désactivé" quand tu relâches), "toggle" (un clic change l'état activé->désactivé, un 2e clic plus tard rechange l'état désactivé->activé, ...), et d'autres types encore dont je ne me souviens plus (ça fait longtemps que j'ai pas fait de dev Mac maintenant que je fais mumuse avec l'iPhone :P)

    Donc peut-être que si tu choisis un mode de fonctionnement "toggle" de ton NSButton, le alternateTitle fait bien ce que tu attends ;)
  • ThibautThibaut Membre
    19:55 modifié #13
    dans 1268838606:

    dans 1268837684:

    Il faut un outlet sur le bouton et non essayer de changer un NSString sortit d'on ne sait où.

    Non, ce n'est pas nécessaire. On possède déjà  une référence vers le bouton cliqué par le paramètre sender transmis à  l'action.
    Par contre, il faudra transtyper sender. ( [tt][(NSButton*)sender sendTitle:@Correction];[/tt] )

    Disons que son exemple ne faisait pas intervenir d'action. Puis on pourrait même faire plus simple :
    [tt]- (IBAction)myButtonAction:(NSButton*)aButton[/tt]
  • prepa75prepa75 Membre
    19:55 modifié #14
    dans 1268839446:

    Oui Céroce a raison, on a déjà  le sender. Si on utilise l'IBAction déclenchée par le bouton pour en profiter pour changer le texte dudit bouton.

    Sauf que dans le cas de prepa75, c'est la déclaration de sa méthode [tt]- (void)changebutton:(NSString *)textbutton[/tt] qui pose problème : le code de cette méthode est bon... à  condition que textbutton représente ton bouton, donc un NSButton*, et non pas représente un texte, donc un NSString* !


    dans mon .h j'ai mis : IBOutlet NSButton *textbutton;

    donc c'est bon non?

    a priori tout va bien  :D

    par contre dites moi si je me trompe mais on ne peut pas attribuer 2 (IBAction) à  un même bouton c'est ça??
    parsque lorsque j'ouvre ue fenêtre déroulante je souhaiterai que le bouton "commencer" apparaisse et lorsque je clique sur commencer,le bouton "correction" apparait...j'ai réussi à  le faire car j'ai mis le texte "commencer" dans l'IBAction de la fenêtre et le texte "correction" dans l'IBAction du boutton.
  • prepa75prepa75 Membre
    19:55 modifié #15
    dans 1268839595:

    Donc peut-être que si tu choisis un mode de fonctionnement "toggle" de ton NSButton, le alternateTitle fait bien ce que tu attends ;)


    en effet je me demander bien à  quoi servait tout ces choix qui étaient dans une langue inconnue  :P

    je pense qu'en essayant un peu tout je devrai trouver mon bonheur...
Connectez-vous ou Inscrivez-vous pour répondre.