Créer un Compte a rebour en seconde
Babyfoot34
Membre
Rebonjour a tous, voila j'ai trouver, sur les exemples de code Apple, comment créer un comteur de temps qui fonctionne tres tres bien. Sauf que voila, j'ai pas tout compris. Je souhaiterai le meme principe mais a l'envers. cad de descendre 25 a 0.
Voici le code du compteur de temps :
Voici le code du compteur de temps :
<br />// Le header<br />IBOutlet UILabel *callTimerLabel;<br /> NSTimer *callTimer;<br /> NSTimeInterval startTime;<br /><br />//Le m<br /><br />- (void) updateElapsedTime:(NSTimer *) timer<br />{<br /> int hour, minute, second;<br /> NSTimeInterval elapsedTime = [NSDate timeIntervalSinceReferenceDate] - startTime;<br /> hour = elapsedTime / 3600;<br /> minute = (elapsedTime - hour * 3600) / 60;<br /> second = (elapsedTime - hour * 3600 - minute * 60);<br /> callTimerLabel.text = [NSString stringWithFormat:@"%02d:%02d", minute, second];<br />}<br /><br />// Initialisation du l'horloge <br /> if (nil == callTimer) {<br /> callTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self<br /> selector:@selector(updateElapsedTime:) userInfo:nil repeats:YES] retain];<br /> startTime = [NSDate timeIntervalSinceReferenceDate];<br /> }<br /><br /><br />
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
Tu rajoutes une variable globale type int CompteurGlobal;
Tu met la valeur a 25
if (nil == callTimer) {
CompteurGlobal = 25;
Puis dans ta routine updateElapsedTime tu décrémente cette variable a chaque appel puis tu arrête le timer
quand elle atteint zéro.
- (void) updateElapsedTime:(NSTimer *) timer
{
int hour, minute, second;
NSTimeInterval elapsedTime = [NSDate timeIntervalSinceReferenceDate] - startTime;
CompteurGlobal--;
if (CompteurGlobal == 0)
{
[timer invalidate]; // arrêt du timer aprés a toi de voir si tu détruit le timer ou pas
return;
}
hour = elapsedTime / 3600;
minute = (elapsedTime - hour * 3600) / 60;
second = (elapsedTime - hour * 3600 - minute * 60);
callTimerLabel.text = [NSString stringWithFormat:@%02d:%02d, minute, second];
}
Pas tester, mais bon cela devrait marcher !
Normalement avec l'option repeats:YES la méthode est appeler automatiquement tous les secondes ?
Les variables globales sont à éviter au maximum (pour de multiples raisons, tant en terme de pattern qu'en terme de pratique pour les effets de bords que ça peut engendrer sur des accès multiples (pour du multithread) ou le fait que c'est aucunement protégé contre un appel extérieur, et pas POO (principe de segmentation).
Une variable d'instance est toute indiquée pour ce cas plutôt.
Comment je fait pour afficher le decompte dans ma vue ? je n'ai pas de variable pour passer le traitement
Quelqu 'un c'est il pourquoi mon compte a rebour panique a la 2eme remise a 0 ?
[self cancelPerformSelector:@selector(decompte) target:self argument:nil];
et le else if ça existe
Mais comme l'écart entre les niveaux est constant, on peut le calculer:
compteur=8-(Niveau-1)*2;
On peut aussi utiliser un tableau C:
Merci a tous les deux pour ces présisions
Je vais tester et appliquer cela immédiatement.
'Quiz' may not respond to '-cancelPerformSelector:target:argument:'
Mon code est placé dans le bouton qui permet de changer de question. Donc le code qui annule le performSelector je l'ai placé en haut.
Ensuite je vais chercher ma qustion et mes réponses possibles et je relance le performSelector.
Puis-je avoir l'annulation et la relance dans la meme action (le bouton) ?
[[self class] cancelPerformSelector:@selector(decompte) target:self argument:nil];
warning: no '+cancelPerformSelector:target:argument:' method found
warning: (Messages without a matching method signature
Il suffit d'utiliser la bonne méthode, avec le bon nom qui existe (mpergand t'as sans doute cité la méthode de tête, mais à toi d'aller vérifier dans la doc quand tu vois qu'il a pas dû donner le nom exact pile poil et t'as juste donné l'idée générale). Même si tu ne connais pas l'existence de cette méthode il suffit d'aller voir dans la doc de "performSelector:withObject:afterDelay:" (que tu utilises plus haut dans ton code et qui est justement ce que tu veux annuler) qui t'explique tout ça (comment annuler, etc)
- (void)cancelPerformSelector:(SEL)aSelector target:(id)target argument:(id)anArgument
est une méthode de NSRunLoop, donc il faut faire:
[[NSRunLoop currentRunLoop] cancel....]
Pour NSObject la méthode s'appelle cancelPrevious...
RTFM as usual