Désactiver bouton

CeetixCeetix Membre
16:20 modifié dans API UIKit #1
Salut tout le monde !

Voilà  j'aimerai savoir comment désactiver un bouton .
Plus précisément :

J'ai plusieurs actions a faire quand je vais cliquer sur mon bouton. J'aimerai que uqnad je clique dessus celui-ci se désactive, qu'on ne puisse plus cliquer dessus.J'ai crée mon bouton que j'ai relié à  un IBAction dans IB. Comment faire apres dans ma fonction :

- (IBAction)monActionDeBouton {
DESACTIVATION
// MON CODE
RE-ACTIVATION
}

Merci ^^

Réponses

  • Eddy58Eddy58 Membre
    16:20 modifié #2
    <br />- (IBAction)monActionDeBouton {<br /> [monBouton disabled];<br />// MON CODE<br /> [monBouton enabled];<br />}<br /><br />
    
  • CeetixCeetix Membre
    16:20 modifié #3
    Merci Eddy58 mais le truc c'est que je pige pas ce qu'est monBouton. enfin si je vois ce que c'est mais je ne l'ai pas nommé quand j'étais sous IB ... Il faut faire comment exactement ?  :(
  • Eddy58Eddy58 Membre
    16:20 modifié #4
    Dans IB, il faut ajouter un outlet "monBouton" dans ton controleur. Ensuite, tu relies cet outlet à  ton bouton.

    Puis dans le fichier d'interfaçage (.h) de ton controleur, tu déclares cet outlet :

    IBOutlet UIButton *monBouton;
  • CeetixCeetix Membre
    16:20 modifié #5
    Merci beaucoup !
    Par contre ce n'est pas :

    [monBouton enabled]

    mais :

    [monBoutton setEnabled:YES]

    Un truc bizar c'est qu'au début de mon code je mets

    [monBouton setEnabled:NO]

    mon code apres (qui est un boucle for )

    puis [monBouton setEnabled:YES]


    Pendant que je vosi la boucle for s'executer je vois bien que le bouton est inactif (en noir) mais si je clique dessus pendant la boucle, une fois que celle-ci est terminée et que mon bouton redevient donc active eh bien ma je re rentre dans mon action de bouton ... Pourquoi donc ?
  • Philippe49Philippe49 Membre
    novembre 2008 modifié #6
    L'événement du clic sur le bouton est mis en attente jusqu'à  sa prise en compte lors de la prochaine boucle d'événements (voir doc sur RunLoop)
  • CeetixCeetix Membre
    16:20 modifié #7
    J'ai regardé un peu la doc dur le NSRunLoop. Je ne sais quelle "task" prendre parmi celle proposée ... J'ai bidouillé un peu le code avec ça et les exemples de apple et c'est un peu bancale...
  • Philippe49Philippe49 Membre
    16:20 modifié #8
    dans 1226167757:

    Un truc bizar c'est qu'au début de mon code je mets
    [monBouton setEnabled:NO]
    mon code apres (qui est un boucle for )
    puis [monBouton setEnabled:YES]

    Pendant que je vosi la boucle for s'executer je vois bien que le bouton est inactif (en noir) mais si je clique dessus pendant la boucle, une fois que celle-ci est terminée et que mon bouton redevient donc active eh bien ma je re rentre dans mon action de bouton ... Pourquoi donc ?

    C'est plus que normal, le temps d'exécution de ta boucle est sans doute très inférieure à  la durée d'appui du doigt sur le bouton de la souris. Quel problème cela te pose-t-il ?
  • CeetixCeetix Membre
    16:20 modifié #9
    Non ma boucle c'est une anumation dedan. Et si je ne désative pas les bouton pendnat cette animation si l'user retape sur le bouton, l'anim se jouera encore une fois apres ...
  • Philippe49Philippe49 Membre
    16:20 modifié #10
    Consulter les posts déjà  existants (et récents)
    • Animations successives sur le même CALayer
    • Succession de flash

    Par ailleurs la rubrique de ton post serait plutôt Frameworks Graphiques (graphisme, animations, OPENGL)
  • CeetixCeetix Membre
    16:20 modifié #11
    Le truc c'est que je vois pas le rapport avec les topics que tu me donnes . Mes anim marchent bien le soucis n'est pas là  je pense. Je veux juste que mon bouton soit désactivé jusqu'à  ce que ma fonction se termine.
    Enfin je me trompe sans doute  :-\\
  • Philippe49Philippe49 Membre
    16:20 modifié #12
    Il faut
    1. Désactiver le bouton
    2. Lancer l'animation
    3. Attendre que l'animation soit finie pour réactiver le bouton

    Les points 1. et 2. se font dans la méthode - (IBAction)monActionDeBouton:(id) sender
    Le point 3. se fait dans la méthode du delegate appelée lorsque l'animation a pris fin.

    Il faut comprendre qu'une animation est un thread, c'est à  dire du code exécutable qui s'exécute en parallèle du code principal. Ainsi, quand tu lances ton animation, deux codes (et plus en fait) s'exécutent simultanément, et les instructions après ta boucle for sont exécutées en même temps que l'animation.
    Une solution est d'attendre la fin du thread d'animation pour faire les mises à  jour de l'interface. 

  • CeetixCeetix Membre
    16:20 modifié #13
    Donc je dois rédiger la fonction -(void) animationDidStop: finished:  et dire dedans que mon bouton redevient actif?
  • Philippe49Philippe49 Membre
    novembre 2008 modifié #14
    C'est cela dans le principe.
    Si tu utilises une CAAnimation
    • Déclarer le delegate par   monAnimation.delegate=self (self par exemple)
    • Implémenter la méthode -(void) animationDidStop: finished: dans le .m du delegate.

    Si tu utilises [UIView beginAnimations: context: ],
    • Déclarer le delegate par la méthode setAnimationDelegate
    • Déclarer le nom de la méthode par setAnimationDidStopSelector
    • Implémenter une méthode nomAuChoix:(NSString*)animationIdentifier finished:(BOOL) flag context:(void*)context
    et .. consulte la doc
  • CeetixCeetix Membre
    16:20 modifié #15
    Moi je suis en CAAnimation.

    Et c'est donc dans la fonction -(void) animationDidStop:finished: que je met : [monBouton setEnabled:YES] ?
  • Philippe49Philippe49 Membre
    16:20 modifié #16
    Oui
  • CeetixCeetix Membre
    16:20 modifié #17
    Je suis pas encore habitué à  la synthaxe des fonctions.
    J'ai mis dans ma boucle le monAnim.delegate = self
    Mais -(void) animationDidStop:finished:  pose probleme au compilateur. De plus si dans mon delegate je met 
    [monBouton setEnabled:YES]  il va me dire qu'il ne connait pas 'monBouton'. Je dois le déclarer une seconde fois dans mon delegate.h ?
  • Philippe49Philippe49 Membre
    16:20 modifié #18
    dans 1226228594:

    Je suis pas encore habitué à  la synthaxe des fonctions.

    Vous avez dit synthaxe ? ou ortograff ? :)  ;)

    dans 1226228594:

    J'ai mis dans ma boucle le monAnim.delegate = self
    Mais -(void) animationDidStop:finished:  pose probleme au compilateur. De plus si dans mon delegate je met   
    [monBouton setEnabled:YES]  il va me dire qu'il ne connait pas 'monBouton'. Je dois le déclarer une seconde fois dans mon delegate.h ?


    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag

    dans 1226228594:

    De plus si dans mon delegate je met 
    [monBouton setEnabled:YES]  il va me dire qu'il ne connait pas 'monBouton'. Je dois le déclarer une seconde fois dans mon delegate.h ?

    C'est self qui reçoit le message et à  priori self connaà®t le bouton, puisque c'est lui qui possède la méthode qui lance l'animation.
    Il n'y a pas à  créer de Delegate.h. Le delegate est un objet quelconque, mais la plupart du temps c'est le contrôleur déclenchant l'animation qui joue ce rôle.


  • CeetixCeetix Membre
    16:20 modifié #19
    J'avais écris la meme chose pour ma fonction et il me mettait synthax error before CAAnimation. J'avais oublié d'importer <QuartzCore/QuartzCore.h>

    Par contre pour 'monBouton' il ne compile pas et me dit: 'undeclared first use in this founction'

    Vais devoir m'améliorer en orthographe ^^
  • Philippe49Philippe49 Membre
    16:20 modifié #20
    dans 1226163500:

    Dans IB, il faut ajouter un outlet "monBouton" dans ton controleur. Ensuite, tu relies cet outlet à  ton bouton.

    Puis dans le fichier d'interfaçage (.h) de ton controleur, tu déclares cet outlet :

    IBOutlet UIButton *monBouton;



    dans 1226229354:

    synthax 'undeclared first use in this founction'

    syntax et function

    Vais devoir m'améliorer en orthographe ^^
    [/quote]


  • CeetixCeetix Membre
    16:20 modifié #21
    Je l'ai bien déclaré dans mon monfichier.h pour m'en servir dans mon monfichier.m  et j'ai bien tout relié et tout marche.
    Mar quand je vais dans mon fichir delegate il me met cette erreur. Il faut refaire la même démarche?


    p.s : sorry pour l'ortho ....  :o
  • Philippe49Philippe49 Membre
    16:20 modifié #22
    Le plus simple est de mettre animationDidStop:finished: dans monfichier.m


    @interface monfichier.m
    IBOutlet UIButton * monBouton;
    @end

    @implementation monfichier.m
    - (IBAction)monActionDeBouton:(id)sender {
    [monBouton setEnabled:NO];
    // lancer l'animation
      animation.delegate=self;
    }


    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
      [monBouton setEnabled:YES];
    }
  • CeetixCeetix Membre
    16:20 modifié #23
    Merci, ca compile parfaitement cette fois ci.
    Bon ca ne marche pas mais je vais essayer de voir ca  :'(
Connectez-vous ou Inscrivez-vous pour répondre.