0

这是我的情况:我正在制作一个倒计时应用程序,它运行良好,但在我打电话时似乎没有停止,[stopWatchTimer invalidate];我不知道为什么。这是我的代码:

- (IBAction)btnStartPressed:(id)sender {
//Start countdown with the time on the Date Picker.

    timeLeft = [pkrTime countDownDuration];

    [self currentCount];

    lblTimer.text = time; //sets the label to the time set above

    pkrTime.hidden = YES;
    btnStart.hidden = YES;
    btnStop.hidden = NO;

    //Fire this timer every second.
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/1.0
                                                  target:self
                                                selector:@selector(reduceTimeLeft:)
                                                userInfo:nil
                                                 repeats:YES];
}
- (void)reduceTimeLeft:(NSTimer *)timer {
    //Countown timeleft by a second each time this function is called
    timeLeft--;
    // Get the system calendar
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];

    // Create the NSDates
    NSDate *date1 = [[NSDate alloc] init];
    NSDate *date2 = [[NSDate alloc] initWithTimeInterval:timeLeft sinceDate:date1];

    // Get conversion to months, days, hours, minutes
    unsigned int unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

    int sec = [conversionInfo second];
    int min = [conversionInfo minute];
    int hour = [conversionInfo hour];

    NSString *seconds = [NSString stringWithFormat:@"%d",sec];
    NSString *minutes = [NSString stringWithFormat:@"%d",min];

    if (sec <= 9)
        seconds = [NSString stringWithFormat:@"0%d", sec];
    if (min <= 9)
        minutes = [NSString stringWithFormat:@"0%d", min];

    if ([conversionInfo hour] == 0)
        time = [NSString stringWithFormat:@"%@:%@", minutes, seconds];
    else
        time = [NSString stringWithFormat:@"%d:%@:%@", hour, minutes, seconds];

    lblTimer.text = time; //sets the label to the time set above

    NSLog(@"%d", timeLeft);

    if (timeLeft == 0) {
        [self timerDone];
        [stopWatchTimer invalidate];
        stopWatchTimer = nil;
    }
}

-(void)timerDone {

    pkrTime.hidden = NO;
    btnStart.hidden = NO;
    btnStop.hidden = YES;

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
    [alert show];

    [self playAlert];
}

请让我知道问题出在哪里......我在任何地方都找不到我的代码的问题!

4

1 回答 1

1

在您的btnStartPressed:方法中,您没有什么可以阻止将一秒NSTimer分配和分配给stopWatchTimer. 如果您按两次按钮,您将得到两个计时器,但只有一个会失效。

添加类似:

 if (stopWatchTimer) return;

到开头btnStartPressed:。如果这不能解决问题,那么除了推测timeLeft为零之外,没有足够的上下文来确定发生了什么?


Nate 说了什么,但这里有另一种解释。

想象一下,如果您这样做(其中 stopWatchTimer 是全局变量或实例变量,没关系):

 stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:....];

现在,这样做:

 stopWatchTimer = nil;
 [stopWatchTimer invalidate];

计时器不会失效,但仍会触发。 stopWatchTimer是对对象的引用。它不是对象本身。因此,当您将第二个计时器分配给 时stopWatchTimer,您将覆盖对第一个计时器的引用,但该计时器仍会触发!

于 2012-12-31T01:49:25.337 回答