0

これが私の問題です。開始ボタンをクリックするとタイマーが実行され、停止ボタンをクリックすると停止します。ただし、スタートボタンをもう一度クリックすると、ゼロに戻ります。タイマーが止まったところからスタートボタンを続けてほしい。

.h

NSTimer *stopWatchTimer;
    NSDate *startDate;
    @property (nonatomic, retain) IBOutlet UILabel *stopWatchLabel;
    - (IBAction)onStartPressed;
    - (IBAction)onStopPressed;
    - (IBAction)onResetPressed;

.m

    - (void)updateTimer
    {
    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    stopWatchLabel.text = timeString;
    }
    - (IBAction)onStartPressed {
    startDate = [NSDate date];
    // Create the stop watch timer that fires every 10 ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
    }
    - (IBAction)onStopPressed {
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;
    [self updateTimer];
    }
    - (IBAction)onResetPressed {
    stopWatchLabel.text = @”00:00:00:000″;
    }

助けてください よろしくお願いします

4

1 に答える 1

0

状態の処理に問題があります。1つの状態は、スタートボタンが押されているが、リセットボタンがその前に押されていないことです。もう1つの状態は、スタートボタンが押されており、その前にリセットボタンが押されていることです。実行できることの1つは、この状態を追跡するためのiVarを作成することです。したがって、次のようなBOOLを使用します。

最初にiVarを宣言します。

BOOL resetHasBeenPushed;

値をNOに初期化します。

次に、これを行います

 - (IBAction)onResetPressed {
    stopWatchLabel.text = @”00:00:00:000″;
    resetHasBeenPushed = YES;

ここで、ある時点でNOに戻す必要があります。これは、startメソッドで実行される可能性があります。

- (IBAction)onStartPressed {
    startDate = [NSDate date];
    // Create the stop watch timer that fires every 10 ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
    resetHasBeenPushed = NO;
}
    }

ちなみに、iVarでNSDateFormatterを作成する場合は、繰り返し初期化する必要はありません。次の行をintiコード、または1回だけ実行されるosmeに移動します。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];

アップデート

これを試して:

- (IBAction)onStartPressed {
    if (resetHasBeenPushed== YES) {
        startDate = [NSDate date];  // This will reset the "clock" to the time start is set
    }

    // Create the stop watch timer that fires every 10 ms
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0
    target:self
    selector:@selector(updateTimer)
    userInfo:nil
    repeats:YES];
    }
于 2012-02-29T20:04:23.850 に答える