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

あなたの方法では、1秒がに割り当てられて割り当てられるのをbtnStartPressed:妨げるものは何もありません。ボタンを2回押すと、タイマーが2つになりますが、無効になるのは1つだけです。NSTimerstopWatchTimer

次のようなものを追加します。

 if (stopWatchTimer) return;

の初めにbtnStartPressed:。それでも問題が解決しない場合は、timeLeftゼロであると推測する以外に何が起こっているのかを確実に知るための十分なコンテキストがありませんか?


ネイトが言ったことですが、ここに別の説明があります。

これを行う場合を想像してみてください(stopWatchTimerがグローバル変数またはインスタンス変数である場合は関係ありません)。

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

今、これを行います:

 stopWatchTimer = nil;
 [stopWatchTimer invalidate];

タイマーは無効になりませんが、それでも起動します。 オブジェクトへのstopWatchTimer参照です。オブジェクト自体ではありません。したがって、に2番目のタイマーを割り当てるstopWatchTimerと、最初のタイマーへの参照が上書きされますが、そのタイマーは引き続き起動します。

于 2012-12-31T01:49:25.337 に答える