web-dev-qa-db-fra.com

Comment puis-je démarrer et arrêter NSTimer?

Je développe l'application Stop Watch. Dans mon application, il y a deux boutons UIB, StartBtn et StopBtn, et j'utilise également NSTimer.

Maintenant, je veux démarrer NSTimer lorsque l'utilisateur clique sur StartBtn et également arrêter lorsque vous cliquez sur StopBtn.

Je sais que NSTimer est arrêté par [MyTimerName invalidate]; mais je ne sais pas comment recommencer NSTimer?

32
user2289379

La classe NSTimer est un peu délicate à utiliser; plutôt que de séparer la création/destruction du démarrage/arrêt, tout est roulé ensemble. En d'autres termes, le chronomètre démarre dès qu'il est créé et s'arrête dès qu'il est détruit.

Vous devez donc utiliser existence de l'objet NSTimer comme indicateur pour indiquer s'il est en cours d'exécution; quelque chose comme ça:

// Private Methods
@interface MyClass ()
{
    NSTimer *_timer;
}
- (void)_timerFired:(NSTimer *)timer;
@end

@implementation MyClass

- (IBAction)startTimer:(id)sender {
    if (!_timer) {
        _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                  target:self
                                                selector:@selector(_timerFired:)
                                                userInfo:nil
                                                 repeats:YES];
    }
}

- (IBAction)stopTimer:(id)sender {
    if ([_timer isValid]) {
        [_timer invalidate];
    }
    _timer = nil;
}

- (void)_timerFired:(NSTimer *)timer {
    NSLog(@"ping");
}
91
trojanfoe

Vous pouvez toujours utiliser le feu pour redémarrer un NStimer

  [timer fire];

Pour l'arrêter:

  [timer invalidate];
  //remember to set timer to nil after calling invalidate;
  timer = nil;
14
Freddy

Vous pouvez démarrer la minuterie

#define kRefreshTimeInSeconds 1
 NSTimer *myTimerName;
 .
 .
 myTimerName = [NSTimer scheduledTimerWithTimeInterval: kRefreshTimeInSeconds 
                                   target:self 
                                   selector:@selector(handleTimer:) 
                                   userInfo:nil
                                   repeats:YES];

Ensuite, la fonction déléguée:

-(void)handleTimer: (id) sender 
{       
   //Update Values in Label here
}

Et pour arrêter Timer

-(void)stopTimer: (id) sender 
{       
   if(myTimerName)
   {
       [myTimerName invalidate];
        myTimerName = nil;
   }
}
8
Suresh Varma