NSTimer ne s'arrête pas
J'ai un timer qui se déclenche lorsque l' viewWillAppear
méthode est appelée et annule lorsque le viewDidDisappear
méthode est appelée. Mais après un certain laps de basculement entre les vues de la minuterie continue de tir, même après qu'il a été invalidé. Quel est le problème?
Voici mon code:
NSTimer *timer;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
timer = [NSTimer scheduledTimerWithTimeInterval: 0.2f
target: self
selector:@selector( timerAction )
userInfo:nil
repeats:YES];
}
-(void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[timer invalidate];
timer = nil;
}
-(void) timerAction
{
NSLog(@"timerAction");
}
Vous devez vous connecter pour publier un commentaire.
J'aurais été en gardant un lien vers la minuterie en la retenant. 🙂
J'ai posé cette question il y a 5 mois, et c'est incroyable de voir comment beaucoup plus d'expérience que j'ai acquise. 🙂
retain
etrelease
ne sont pas autorisés?repeats: NO
minuteries.C'est une solution absolue. Aucun de ceux ci-dessus a travaillé pour moi, j'ai donc fait cela,
où vous souhaitez démarrer la minuterie,
La méthode que le minuteur d'appels,
espère que cette aide,
Une méthode appelée par une minuterie doit avoir la définition
De cette façon, la méthode a l'exemple de la minuterie, qui a été congédié. La façon dont vous le faites, la méthode ne permet pas de savoir si la minuterie a été invalidé ou pas.
Essayez de changer votre minuterie, l'initialisation de la
et la méthode de
Espère que ça aide
Cela peut ne pas être le problème, mais vous avez besoin de conserver la référence à l'horloge qui est retourné à partir de scheduledTimerWithInterval:. Sans cela, votre pointeur de la minuterie peut être invalide au moment où vous allez l'arrêter.
Aussi, essayez de définir un point d'arrêt dans viewDidDisappear et assurez-vous qu'il s'appelle!
Cela a fonctionné pour moi dans Swift
Vous avez oublié de libérer la minuterie dans
viewWillDisappear:
Cela ne devrait pas causer de la minuterie pour continuer à tirer si...
De
invalidate
la doco dit"L'exécution de la boucle supprime et communiqués de la minuterie, soit juste avant la méthode invalidate retourne ou à un moment plus tard."
Je suppose que le vôtre est de se retiré à un moment plus tard.
J'ai eu le même problème.
Je ne peux pas dealloc mon exemple, si la minuterie est toujours en cours, donc je dois l'arrêter avant d'appeler :
Après l'appel de cette méthode de mon timer vraiment arrêter
- (void)viewWillAppear:(BOOL)animated
est appelée de nouveau.En fait, elle est appelée à chaque fois que vous changer de vue ou après que vous fermez une vue modal. Fondamentalement, tout le temps de votre point de vue en fait réapparaît sur l'écran, pas seulement la première fois.
Donc dans ce cas la minuterie obtient redémarré, même s'il est a été invalidé en avant.
Après la création de votre minuterie il suffit de s'inscrire pour s'exécuter en
NSRunLoopCommonModes
:[[NSRunLoop currentRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];
Puis
invalidate
méthode de travail.Cela fonctionne pour moi