Appuie long sur un button
Bonjour,
J'ai une vue avec quatre bouton. Dans cette vue il y aussi un textField me permettant de rentrer un string.
Tous les boutons sont programmés pour agir lorsque l'on touchup inside.
Je souhaiterais leur rajouter une fonctionnalité. Quand on fait un appuie long (deux seconde par exemple) sur un des boutons, je voudrais que le title du bouton soit modifié par le .text du textfield.
Merci pour votre aide.
Alexandre.
J'ai une vue avec quatre bouton. Dans cette vue il y aussi un textField me permettant de rentrer un string.
Tous les boutons sont programmés pour agir lorsque l'on touchup inside.
Je souhaiterais leur rajouter une fonctionnalité. Quand on fait un appuie long (deux seconde par exemple) sur un des boutons, je voudrais que le title du bouton soit modifié par le .text du textfield.
Merci pour votre aide.
Alexandre.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
- lancer un timer dans le touchDown, d'une durée de 2 secondes, et avec comme action le @selector qui va exécuter ton code à faire lors d'un appui long
- et dans le touchUp, tu invalides ce timer
Comme ça si tu fais un appui de moins de 2 secondes le timer va se lancer mais va pas avoir le temps de se terminer car tu auras fait un touchUp avant les 2 secondes donc ça l'aura invalidé. Et sinon si u fais un touchDown de plus de 2 secondes, au bout de 2 secondes le code de ton appui long va s'exécuter, sans attendre le touchUp.
Et dans la méthode où tu enlèves ton appui (touchUpInside donc), tu invalides ton NSTimer, donc :
- soit tu arrives là avant les 2 secondes et donc ça "annule" le timer donc la méthode pour l'appui long ne sera finalement pas appelée...
- soit tu arrives dans cette méthode après les 2 secondes (et donc la méthode pour l'appui long aura eu le temps d'être appelée par le NSTimer entre temps)...
Mais dans tous les cas tu peux continuer d'exécuter du code dans ta méthode de touchUp.
Moi j'ai implémenté ça dans une UIView avec les méthodes de NSResponder touchBegan/touchEnded : j'ai une variable d'instance [tt]NSTimer* longTouchTimer[/tt] dans le .h de ma classe, et en gros mon code ressemble à :
Alexandre.
- [tt][self performSelector:@selector(longTouchAction withObject:nil afterDelay:2.0];[/tt] dans "touchBegan"
- [tt][NSObject cancelPreviousPerformRequestsWithTarget:self];[/tt] dans le touchEnded (et le touchCancelled)
Bon c'est vrai que là on ne peut plus tester si le timer a été exécuté (isValid) ou pas du coup puisqu'on n'y a plus accès directement... mais ça reste sans doute quand même plus propre. Et si on veut tester pour savoir s'il y a eu un appui long de fait ou pas, je trouve plus propre de faire comme ça et de rajouter une variable booléenne [tt]BOOL longTouch[/tt] qu'on passe à NO dans [tt]touchBegan[/tt], et à YES dans [tt]longTouchAction[/tt] comme ça dans [tt]touchEnded[/tt] on peut savoir si y'a eu un longTouch ou pas
On fait une double connection du bouton pour Touch Down et Touch Up Inside sans jouer sur le touchBegan && touchEnded
(avec le downDate qui reste à désallouer à la fermeture du view controller, il faut sans doute mieux le mettre en variable d'instance @private)
J'ai utilisé la première méthode d'ali et ça fonctionne super.
Alexandre.