2012-09-19 3 views
1

Ok, je veux créer des minuteurs MULTIPLES qui commencent tous à un moment différent (25, 50,1 min, 1min 30s ...) mais je ne sais pas comment le faire s'arrêter quand il atteint 0 et quand il atteint zéro, amenez le "Player" à une autre vue.Comment créer un compte à rebours dans xcode 4.5

Heres mon .h

@interface ViewController :UIViewController { 

IBOutlet UILabel *seconds; 

NSTimer *timer; 

int MainInt; 
} 

@end 

Et voici mon fichier .m

@implementation ViewController 

-(void)countDownDuration { 

MainInt -= 1; 

seconds.text = [NSString stringWithFormat:@"%i", MainInt]; 

} 

-(IBAction)start:(id)sender { 

MainInt = 25; 

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 

             target:self 
             selector:@selector(countDownDuration) 
             userInfo:nil 
             repeats:YES]; 
} 

@end 

Répondre

5

NSTimer ne le fait pas automatiquement, mais il est trivial de l'ajouter à votre méthode de countDownDuration. Par exemple:

-(void)countDownDuration { 
    MainInt -= 1; 
    seconds.text = [NSString stringWithFormat:@"%i", MainInt]; 
    if (MainInt <= 0) { 
    [timer invalidate]; 
    [self bringThePlayerToAnotherView]; 
    } 
} 

Bien sûr, vous souhaitez créer plusieurs temporisateurs. Vous pouvez stocker chacun dans une variable différente et donner à chacun un sélecteur différent. Mais si vous regardez la documentation de NSTimer, la méthode de rappel prend en fait l'objet timer en tant que sélecteur; vous l'ignorez, mais vous ne devriez pas l'être. Et pendant ce temps, vous pouvez stocker un objet de n'importe quel type comme userInfo pour le timer, c'est donc un bon endroit pour stocker une valeur de compte à rebours séparée pour chaque timer.

Ainsi, vous pouvez faire quelque chose comme ceci:

-(void)countDownDuration:(NSTimer *)timer { 
    int countdown = [[timer userInfo] reduceCountdown]; 
    seconds.text = [NSString stringWithFormat:@"%i", countdown]; 
    if (countdown <= 0) { 
    [timer invalidate]; 
    [self bringThePlayerToAnotherView]; 
    } 
} 

-(IBAction)start:(id)sender { 
    id userInfo = [[MyCountdownClass alloc] initWithCountdown:25]; 
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(countDownDuration:) 
             userInfo:userInfo 
              repeats:YES]; 
} 

J'ai laissé quelques détails non écrite (comme la définition de MyCountdownClass -qui doit inclure la méthode initWithCountdown: et reduceCountdown qui font la bonne chose), mais ils devraient tous être assez simples. (Aussi, vous voulez probablement un userInfo qui stocke plus que la valeur du compte à rebours - par exemple, si chaque timer envoie le lecteur à une vue différente, vous devez également y mettre la vue.)

PS, notice que vous avez maintenant besoin de @selector(countDownDuration:). Les nouveaux arrivants à ObjC se moquent tout le temps. countDownDuration: et countDownDuration sont des sélecteurs complètement indépendants.

PPS, la définition complète de MyCountdownClass devra être visible dans countDownDuration: (sauf si vous avez une autre classe avec les mêmes sélecteurs). Vous pouvez vouloir convertir le résultat de userInfo en MyCountdownClass * pour clarifier les choses.

+0

Je reçois cette erreur sous int countdown = [[timer userInfo] reduceCountdown]; Pas de méthode d'instance connue pour le sélecteur 'reduceCountdown' –

+0

Eh bien, oui, quand vous définissez votre 'MyCountdownClass', vous devez lui donner une méthode' reduceCountdown', ou vous ne pourrez pas appeler 'reduceCountdown' dessus. Désolé de ne pas être plus clair; Je vais éditer la réponse. – abarnert