2009-06-19 14 views
1

Un bouton de mon interface, , lorsqu'il est maintenu enfoncé, effectue une série de modifications sur d'autres parties de mon interface.Est-ce un travail pour NSTimer? Boucler les modifications de l'interface

Par exemple, pendant une seconde texte passe au bleu, puis un UImageView va changer son image pendant deux secondes ... etc etc ...

Cette série de changements tourne en boucle à travers les mêmes étapes que tant que le bouton est maintenu enfoncé.

Je n'ai jamais utilisé NSTimer auparavant, mais serait-ce le chemin à parcourir?

Répondre

3

Vous n'avez pas besoin d'un NSTimer pour cela, vous pouvez simplement utiliser performSelector: withObject: afterDelay: séquencer d'une méthode à la suivante jusqu'à ce que vous recommenciez. Démarrez le processus lorsque le bouton est maintenu enfoncé et appelez cancelPreviousPerformRequestsWithTarget: selector: object: lorsque le bouton est relâché. Quelque chose comme:

- (void) step1 
{ 
    // turn blue 
    [self performSelector:@selector(step2) withObject:nil afterDelay:1.0]; 
} 

- (void) step2 
{ 
    // change image 
    [self performSelector:@selector(step3) withObject:nil afterDelay:2.0]; 
} 

- (void) step3 
{ 
    // turn red 
    [self performSelector:@selector(step1) withObject:nil afterDelay:3.0]; 
} 

- (void) stopSteps 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(step1) object:nil]; 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(step2) object:nil]; 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(step3) object:nil]; 
} 

Vous pouvez rappeler le sélecteur en cours d'exécution « performSelector » et annuler seulement une, mais sa peine vaut souvenir. Alternativement, vous pouvez utiliser un NSTimer et un automate à états, mais pour ce que vous décrivez, ce qui précède est probablement plus facile - cela dépend de la cohérence de votre séquence et de la possibilité de spécifier votre séquence comme un ensemble d'étapes comme ci-dessus, ou un ensemble de données (dans ce cas, utilisez une machine d'état de quelque sorte, avec un NSTimer ou un execSelector: withObject: afterDelay :)

+0

Merci, cela fonctionne. Pour référence future, je stocke les temps de retard dans un tableau, avec plusieurs objets créés comme ceci: NSNumber * one = [NSNumber numberWithDouble: 0.30]; NSNumber * deux = [NSNumber numberWithDouble: 0.50]; .. etc. a dû convertir chaque objet dans le tableau pour doubler, le NSTimerInterval, comme suit: double dubNum = [[[array arrayAtIndex: 0] doubleValue]; NSTimeInterval dubNumTimer = dubNum; ... puis utilisé afterDelay: dubNumTimer – cannyboy

+0

^NSTimerInterval = then NSTimerInterval – cannyboy