33 votes

Xcode Objective-C | iOS: fonction de retard / aide de NSTimer?

Je suis donc de développer ma première application iOS et j'ai besoin d'aide..

Programme Simple pour l'instant, j'ai environ 9 boutons et lorsque j'appuie sur le premier bouton, ou n'importe quel bouton, je veux juste le premier bouton pour mettre en surbrillance pour 60 millisecondes, unhighlight, deuxième bouton faits saillants, attendre 60 millisecondes, unhighlight et ainsi de suite pour le reste des boutons de sorte qu'il ressemble à un déplacement de la LED.

J'ai regardé essayé de sommeil/usleep mais une fois que la durée du sommeil est fait, il me semble qu'il ignore le point culminant/unhighlight tous ensemble.

Par exemple:

- (void) button_circleBusy:(id)sender{
firstButton.enabled = NO;
sleep(1);
firstButton.enabled = YES;

et ainsi de suite pour le reste des boutons. Il N'retard, mais il ne doit pas retarder l' "firstButton.enabled = NO;". J'ai une photo pour chaque bouton est "désactivé" et je n'ai jamais le voir.

Toute aide est appréciée! J'ai regardé dans NSTimer mais je ne savais pas comment la mettre en œuvre.

Merci.

-Paul

51voto

ughoavgfhw Points 28400

sleep ne fonctionne pas car l'affichage ne peut être mis à jour qu'après le retour de votre thread principal au système. NSTimer est la voie à suivre. Pour ce faire, vous devez implémenter des méthodes qui seront appelées par la minuterie pour changer les boutons. Un exemple:

 - (void)button_circleBusy:(id)sender {
    firstButton.enabled = NO;
    // 60 milliseconds is .06 seconds
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];
}
- (void)goToSecondButton:(id)sender {
    firstButton.enabled = YES;
    secondButton.enabled = NO;
    [NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToThirdButton:) userInfo:nil repeats:NO];
}
...
 

47voto

Avner Barr Points 1912
int64_t delayInSeconds = 0.6;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
     do something to the button(s)
});

29voto

Alex Haas Points 308

Moins de code est meilleur.

 [NSThread sleepForTimeInterval:0.06];
 

25voto

ramirogm Points 487

Une méthode légèrement moins explicite consiste à utiliser performSelector: withObject: afterDelay: qui configure pour vous l'objet NSTimer et qui peut être facilement annulé.

Donc, continuons avec l'exemple précédent, ce serait

 [self performSelector:@selector(goToSecondButton) withObject:nil afterDelay:.06];
 

Plus d' infos dans la doc

16voto

Joe Völker Points 309

Essayer

 NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X