web-dev-qa-db-fra.com

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

Je développe donc 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 sur n’importe quel bouton, je souhaite simplement que le premier bouton soit mis en surbrillance pendant 60 millisecondes. reste des boutons donc il ressemble à une LED en mouvement.

J'ai déjà essayé de dormir/m'endormir, mais une fois que la durée du sommeil est terminée, il semble que le saut/la surbrillance soit ignoré.

Par exemple:

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

et ainsi de suite pour le reste des boutons. Cela ne retarde pas, mais cela ne retarde pas le "firstButton.enabled = NO;". J'ai une image pour "l'état désactivé" de chaque bouton et je ne la vois jamais.

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

Merci.

-Paul

33
Retro

sleep ne fonctionne pas car l'affichage ne peut être mis à jour qu'après le retour de votre thread principal vers le 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];
}
...
50
ughoavgfhw
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)
});
47
Avner Barr

Moins de code est meilleur.

[NSThread sleepForTimeInterval:0.06];

Rapide:

Thread.sleep(forTimeInterval: 0.06)
29
Alex Haas

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

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

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

Plus info dans le doc

25
ramirogm

Essayer

NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
16
Joe Völker

Je voudrais ajouter un peu la réponse de Avner Barr. Lorsque vous utilisez int64, il semble que lorsque vous dépassez la valeur 1.0, la fonction semble différer différemment. Donc, je pense qu'à ce stade, nous devrions utiliser NSTimeInterval.

Donc, le code final est:

NSTimeInterval delayInSeconds = 0.05;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

//do your tasks here

});
3
John Bassos
[NSTimer scheduledTimerWithTimeInterval:.06 target:self selector:@selector(goToSecondButton:) userInfo:nil repeats:NO];

Est le meilleur à utiliser. Utiliser le sommeil (15); empêchera l'utilisateur d'effectuer d'autres actions. Avec la fonction suivante, vous devriez remplacer goToSecondButton par le sélecteur ou la commande approprié, qui peut également provenir des frameworks.

0
Hanson So