0

ストップウォッチを作っているのですが、スタートボタンしか機能しません。開始ボタンが押されると、ループに入ります。

- (void)stopwatch
{
NSInteger hourInt = [hourLabel.text intValue];
NSInteger minuteInt = [minuteLabel.text intValue];
NSInteger secondInt = [secondLabel.text intValue];

if (secondInt == 59) {
    secondInt = 0;
    if (minuteInt == 59) {
        minuteInt = 0;
        if (hourInt == 23) {
            hourInt = 0;
        } else {
            hourInt += 1;
        }
    } else {
        minuteInt += 1;
    }
} else {
    secondInt += 1;
}

NSString *hourString = [NSString stringWithFormat:@"%02d", hourInt];
NSString *minuteString = [NSString stringWithFormat:@"%02d", minuteInt];
NSString *secondString = [NSString stringWithFormat:@"%02d", secondInt];

hourLabel.text = hourString;
minuteLabel.text = minuteString;
secondLabel.text = secondString;

CGRect hourFrame = self->hourBar.frame;
CGRect minuteFrame = self->minuteBar.frame;
CGRect secondFrame = self->secondBar.frame;

if ((NSInteger)hourFrame.size.height != hourInt) { // check if we need to modify
    hourFrame.origin.y -= ((hourInt * 10.0) - hourFrame.size.height);
    hourFrame.size.height = (hourInt * 10.0);

    self->hourBar.frame = hourFrame;
}

if ((NSInteger)minuteFrame.size.height != minuteInt) { // check if we need to modify
    minuteFrame.origin.y -= ((minuteInt * 4.0) - minuteFrame.size.height);
    minuteFrame.size.height = (minuteInt * 4.0);

    self->minuteBar.frame = minuteFrame;
}

if ((NSInteger)secondFrame.size.height != secondInt) { // check if we need to modify
    secondFrame.origin.y -= ((secondInt * 4.0) - secondFrame.size.height);
    secondFrame.size.height = (secondInt * 4.0);

    self->secondBar.frame = secondFrame;
}

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(stopwatch) userInfo:nil repeats:NO];
}

停止ボタンを押すと、このループを一時停止して、ユーザーが開始を押すとストップウォッチが再開されるようにします。

リセットボタンを押したらループを止めて0に戻したい。

私は初心者なので、できるだけ簡単に答えていただければ幸いです。

4

4 に答える 4

0

以前の質問に基づいて、タイマーをstopwatchメソッドの外に移動したようです。タイマーとループは 2 つの非常に異なるものであることを忘れないでください。

NSTimerを呼び出すことで停止できますinvalidate詳細については、 Apple のドキュメントを参照してください。

于 2013-08-24T17:34:09.210 に答える
0

完全にスレッドセーフではないかもしれませんが、私がテストしたところうまくいく方法の 1 つは、クリックすると true に設定され、クリックするstartと false に設定される変数を使用することですstop

たとえば、私.hの に を追加@property (nonatomic) BOOL go;した後、提供したメソッドの最初の行として、次のような if チェックを追加します。

- (void)stopwatch {
    if (!self.go) return;
    //..do the rest of your stopwatch code
    //the timer call
}

次に、私の開始ボタンと停止ボタンの呼び出しは次のようになります。

- (void)start {
    if (!self.go) { // Do not call the stopwatch method again if it is already going.
        self.go = YES;
        [self stopwatch];
    }
}

- (void)stop {
    self.go = NO;
}
于 2013-08-24T17:36:47.130 に答える
0

ループは、このタイプの操作には不適切な構造です。より適切に制御するには、NSTimerを使用します。

関連する例はここにあります。

編集:

私の上記の回答は、あなたの質問の以前のバージョンに基づいていました。そうNSTimerです、ループの一部ではなく、ループを制御するものでなければなりません。

一般的な実装:

  • Start は、タイマーの開始のみをマークする必要があります。また、システム クロックからの現在の時刻にも注意してください。(これはオプションですが)
  • タイマー関数は、時間変数の値を変更し、ストップウォッチの設定値と比較する必要があります。経過時間 == 設定値の場合、 を使用してタイマーを停止しinvalidateます。
  • Stop はタイマーを中断して停止し、経過時間の値も 0 に設定する必要があります。同じ時間値を再利用したくない場合は、時間変数もリセットする必要があります。
于 2013-08-24T17:24:14.987 に答える
0

「ループ」メソッドからタイマーを取り出して、繰り返すようにする必要があります。「ループ」を開始したという事実ではなく、ストップウォッチを動かしているものであるべきです。その後、必要に応じてタイマーを停止し、後で再開できます。また、Google でタイマーを一時停止する正しい方法を見つけることもできます (100% 正確にするには、指定された発火日に開始するようにタイマーを変更する必要がありますが、残りの秒数を知るだけで十分な場合があります)。

于 2013-08-24T17:25:32.017 に答える