2013-08-14 3 views
0

У меня есть таймер, который отлично работает, если таймер находится на переднем плане. Он отлично прекращается и останавливается на 0. Однако, когда я нажимаю кнопку homebutton, чтобы перейти на главный экран, а затем дождитесь появления локального уведомления, а затем я коснусь уведомления, временной интервал превратится в 4,2 миллиарда (предел для unsigned long int). В принципе, он не останавливается на 0. Я не уверен, как это исправить. Я попытался сделать его обычным NSInteger и проверить, был ли интервал ниже 0, но я получил те же результаты.Таймер обратного отсчета не останавливается на 0

-(IBAction)startTimer:(id)sender{ 
    if (!timer) { 
     [startButton setTitle:@"Start" forState:UIControlStateNormal]; 
     timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES]; 
     date = [NSDate date]; 
    } else { 
     [startButton setTitle:@"Stop" forState:UIControlStateNormal]; 
     anotherTimeInterval = testTask.timeInterval; 
     [timer invalidate]; 
     timer = nil; 
    } 

} 

-(void)timerAction:(NSTimer *)t 
{ 
    NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:date]; 
    if (testTask.timeInterval > 0){ 
     NSError *error; 
     if (![self.context save:&error]) { 
      NSLog(@"couldn't save: %@", [error localizedDescription]); 
     } 
     NSUInteger seconds = (NSUInteger)round(anotherTimeInterval-interval); 
     NSString *string = [NSString stringWithFormat:@"%02u:%02u:%02u", 
          seconds/3600, (seconds/60) % 60, seconds % 60]; 
     testTask.timeInterval = seconds; 
     timerLabel.text = string; 
     NSLog(@"%@", string); 
    } else { 
     NSLog(@"timer ended"); 
     [self.timer invalidate]; 
     self.timer = nil; 
     [self timerExpired]; 
    } 
} 

-(void)applicationWillResignActive:(UIApplication *)application{ 
    if (timer){ 
     UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
     localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:testTask.timeInterval]; 
     localNotification.alertBody = @"Time is up"; 
     localNotification.alertAction = @"Ok"; 
     localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
     [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
    } 
} 

ответ

1

%02u вы используете в stringWithFormat: разбирает значение как беззнаковое междунар.

Кроме того, и я думаю, что это ваша проблема, вы проверяете testTask.timeInterval в своем заявлении if, но получаете количество секунд из переменной interval, которую вы получаете в начале метода. Итак, вы всегда проверяете предыдущее значение, а это значит, что вы всегда на одну секунду отстаете.

Edit: Вы могли бы сделать somehting так:

NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:date]; 
if (anotherTimeInterval-interval > 0){ 
    ... 
} 

Таким образом, вы проверяете новое значение вместо старого.

Надеется, что это помогает

+0

ОК, что имеет смысл ... так вы говорите, я не должен проверить для значения testtask.interval, а что-то другое? – EvilAegis

+0

Я обновил свой ответ –

Смежные вопросы