I have a timer for my project, each time it decrements by 1 second. But if the counter starts working for the second time it gets decremented by 2 seconds and for the third time by 3 seconds etc. what should I do to get 1 sec decrement for all the time?
-(void)viewDidAppear:(BOOL)animated {
count=15; //timer set as 15 seconds
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:)userInfo:nil repeats:YES]; //for decrementing timer
}
- (void)updateCounter:(NSTimer *)theTimer {
count -= 1;
NSString *s = [[NSString alloc] initWithFormat:@"%d", count];
if(count==0) // alert for time expiry
{
alert = [[UIAlertView alloc] initWithTitle:@"Time Out!!" message:@"Your time is expired." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[alert show];
self.timer.hidden=YES;
[self dismissModalViewControllerAnimated:YES];
}
else {
self.timer.text = s;
}
[s release];
}
From what you've posted, you're creating multiple timers and not stopping any of them. So after 3 times, you have 3 timers firing each second.
At a minimum, when the timer hits zero you want to invalidate it:
[theTimer invalidate]
But you may also want to consider holding onto the timer you create (in a @property) so that you can invalidate and release it if the user leaves this view some other way before your counter actually goes to zero.
Hope that helps.
EDIT
(Just as I posted this I notice that you have know accepted the above answer and seemed to have removed your 'its not working' comment for the answer from @Firoze Lafeer. But I will leave this here any way.)
Running the code below as a test I do not get your issue. And even when I did not invalidate I just got multiple outputs in the log.
Instead of seeing what is going on by looking at what the textfield in the app is doing. Try and use logging as I have below to see if that gives you a better idea of what is happening.
-(IBAction)runTimer:(id)sender { // attached to a button
[self invalidateTimer];
count=15; //timer set as 15 seconds
//for decrementing timer
countimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(updateCounter:)
userInfo:nil
repeats:YES];
}
-(void)updateCounter:(NSTimer *)theTimer {
count -= 1;
NSLog (@"count =@%d", count);
if(count==0) // alert for time expiry
{
[self invalidateTimer];
}
}
-(void)invalidateTimer {
if ([countimer isValid]) {
[countimer invalidate];
NSLog(@"countimer invalidated ");
countimer = nil;
}
}