2013-03-05 4 views
1
self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopProgressView) userInfo:nil repeats:NO]; 

-(void)stopProgressView 
{ 
    if ([self.timerProgress isValid]) { 
     [self.timerProgress invalidate]; 
     self.timerProgress=nil; 
    } 

} 

et sur un bouton clic lorsque j'ai essayé d'invalider l'objet NSTimercomment invalider NSTimer?

-(void)cancelTimer 
{ 
     if ([self.timerProgress isValid]) { 
      [self.timerProgress invalidate]; 
      self.timerProgress=nil; 
     } 
} 

il ne soit pas invalide. Il appelle une fois stopProgressView après l'intervalle de 50. Comment obtenir une résolution de ce problème?

+0

"Il appelle une fois stopProgressView après l'intervalle de 50" - Je ne peux pas donner de sens à cette question. Aussi, quel "problème"? –

+1

votre code utilisant n'est pas un problème dans votre code.Put votre schedTimeWithTimeInterval: 5 secondes pas 50 pour tester votre code @ H2CO3 est juste –

+0

Je ne comprends pas ce que vous essayez de faire dans 'stopProgressView', le' sélecteur 'pour votre minuterie: Vous créez une minuterie qui est non récurrente et quand elle se déclenche (la seule et unique fois qu'elle se déclencherait), vous l'invalidez. Pourquoi s'embêter? Dans 'cancelTimer', bien, mais inutile dans' stopProgressView'. En réponse à votre question sur la raison pour laquelle 'cancelTimer' ne semble pas fonctionner, avez-vous essayé le breakpoint/log dans cette méthode? Êtes-vous sûr que ça s'appelle? (Ce n'est pas un 'IBAction', donc je me méfie.) En conclusion, c'est la bonne façon d'invalider, donc ça ne doit pas être appelé. – Rob

Répondre

1
- (IBAction)stopTimer { 
    if ([timerProgress isValid]) { 
     [timerProgress invalidate]; 
    } 
} 

Ne pas utiliser self.timerProgress utiliser juste timerProgress

+0

Je ne pense pas que cela soit pertinent. Si vous avez synthétisé la variable d'instance, vous n'avez pas besoin de self. Mais si vous êtes passé à Objective C 2.0, vous ne faites pas la synthèse, et utilisez self ou _ . –

0

Il semble que de ce que vous publiez cela devrait fonctionner. C'est comme ça que je l'ai dans mes applications et ça marche bien.

Cependant, vous pouvez essayer de faire une sélecteur qui prend un objet timer comme:

-(void)stopProgressView:(NSTimer *)timer{ 
    //do stuff with timer here 
} 

Notez que cela signifie également que vous devez changer @selector (stopProgressView) à @selector (stopProgressView :). Bien que pour l'enregistrement ma fonction de minuterie d'arrêt actuelle utilise juste [self.timer invalidate] et cela fonctionne bien. Mon autre conseil pour le débogage est d'utiliser NSLogs pour s'assurer que chacune des méthodes est effectivement appelée, et que lorsque la méthode est appelée NSLog dans la clause if pour s'assurer que cela fonctionne.

0

Vous créez NSTimer avec des NSRunLoop afin que votre NSTimer pas commencé, d'ajouter ce code après

self.timerProgress = [NSTimer scheduledTimerWithTimeInterval:50.0 
                 target:self 
                selector:@selector(stopProgressView) 
                userInfo:nil 
                repeats:NO]; 

//add 

[[NSRunLoop currentRunLoop] addTimer:_tapTimer 
          forMode:NSDefaultRunLoopMode]; 
+0

L'OP mentionne que le timer fonctionne, donc il doit être sur * a * run loop, probablement pas le même que l'invalidate. –

1

La raison la plus probable est que votre minuterie programmée sur une boucle de course différent de celui où vous essayez et l'invalider.

Les temporisateurs doivent être invalidés sur le même thread/runloop que la boucle d'exécution sur laquelle ils sont planifiés. La touche Cocoa n'est pas adaptée aux threads. Vous devez donc exécuter toutes les activités liées à l'interface utilisateur sur le thread principal. Cela peut fonctionner si vous travaillez sur des threads différents, mais alors vous aurez des crashs aléatoires, et vous génèrerez aussi des problèmes de timer comme ça.

+0

enfin cela doit être la réponse. J'ai eu le même problème. – ikrabbe