2012-10-21 1 views
0

Lorsque j'appuie sur le bouton d'arrêt pour arrêter la minuterie, l'appareil revient à l'heure d'origine et recommence le compte à rebours. J'ai regardé partout et tout ce que j'ai trouvé est "invalide" et ça ne marche pas. Je veux que l'heure s'arrête quand j'appuie sur stop et que l'étiquette affiche l'heure d'origine. J'ai aussi désactivé le comptage automatique pour que je puisse essayer de libérer et il me donne une erreur:Comment arrêter un NSTimer

0x10e20a5: movl 16(%edx), %edx EXC_BAD_ACCESS (code=2, address=0x10)

NSTimer *rockettTimer; 
int rocketCount; 

@interface FirstViewController() 
@property (strong, nonatomic) IBOutlet UILabel *rocketTimer; 

- (IBAction)stopButton:(id)sender; 
- (IBAction)startButton:(id)sender; 

@end 

@implementation FirstViewController 
@synthesize rocketTimer; 

-(void) rocketTimerRun{ 
    rocketCount = rocketCount - 1; 
    int minuts = rocketCount/60; 
    int seconds = rocketCount - (minuts * 60); 
    NSString *timerOutput = [NSString stringWithFormat:@"%d:%.2d", minuts, seconds]; 
    rocketTimer.text = timerOutput; 
} 

- (IBAction)startButton:(id)sender { 
    rocketCount = 180; 
    rockettTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(rocketTimerRun) userInfo:nil repeats:YES]; 

- (IBAction)stopButton:(id)sender { 
    [rockettTimer invalidate]; 
    //[rockettTimer release]; 
} 

- (void)viewDidLoad 
{ 


    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
} 

- (void)viewDidUnload 
{ 
    [self setRocketTimer:nil]; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } else { 
     return YES; 
    } 
} 


@end 
+1

Etes-vous sûr que votre stopButton est connecté à stopButton et non startButton par erreur? Notez également qu'invalider libère le temporisateur, donc n'appelez pas release et invalidez. – rmaddy

+0

Vous pourriez vouloir regarder votre code plus près, rien n'empêche l'utilisateur d'appuyer plus d'une fois sur start et de créer plusieurs temporisations que vous continuerez ensuite à faire ... d'où le BAD_ACCESS –

Répondre

2

J'imagine que vous appuyez sur le bouton de démarrage à plusieurs reprises. Chaque fois que la fonction startButton est appelée, elle va créer une nouvelle minuterie et oublier l'ancienne. Pour éviter cela, je suggère de mettre un [rockettTimer invalidate] immédiatement avant de créer la nouvelle minuterie.

Vous devez également initialiser rockettTimer à zéro. Mieux encore, vous devriez en faire une variable membre de la classe car pour le moment vous ne pourrez pas avoir plusieurs instances de cette classe.

+0

oui ce code a beaucoup de problèmes ... réécrire! –

-1

Vous devriez essayer d'utiliser une autre méthode pour initialiser votre minuteur. Et faites-le dans viewDidLoad: