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
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];
}
...
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)
});
Moins de code est meilleur.
[NSThread sleepForTimeInterval:0.06];
Rapide:
Thread.sleep(forTimeInterval: 0.06)
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
Essayer
NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.06 ];
[NSThread sleepUntilDate:future];
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 });
[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.