1

ランダムな時間(0〜10秒)後にタイマーを開始するボタンを実装しようとしています。タイマーの実行中は、経過時間を示すために 0.005 秒ごとにラベルを更新する必要があります。私が抱えている問題は2倍です:

  1. ラベルを 0.005 秒ごとに経過時間で更新する方法がわかりません。

  2. タイマーを開始する前にアプリをランダムな時間待機させるのに問題があります。現在私は使用しsleep(x)ていますが、アプリがステートメント内の他のすべてのコードを無視しif、ボタン画像がフリーズするようです (つまり、まだクリックされているように見えます)。

ここに私がこれまでに持っているコードがあります...

- (IBAction)buttonPressed:(id)sender
{
    if ([buttonLabel.text isEqualToString:@"START"]) 
    {
        buttonLabel.text = @" "; // Clear the label
        int startTime = arc4random() % 10; // Find the random period of time to wait
        sleep(startTime); // Wait that period of time
        startTime = CACurrentMediaTime();  // Set the start time
        buttonLabel.text = @"STOP"; // Update the label
    }
    else
    {
        buttonLabel.text = @" ";
        double stopTime = CACurrentMediaTime(); // Get the stop time
        double timeTaken = stopTime - startTime; // Work out the period of time elapsed
    }
}

誰かに何か提案があれば..

A) ラベルを経過時間で更新する方法。

また

B) アプリがフリーズする「遅延」期間を修正する方法

...この時点で私はかなり困惑しているので、それは本当に役に立ちます。前もって感謝します。

4

2 に答える 2

3

これを行うには、 NSTimerを使用する必要があります。コードを試してください:

- (void)text1; {
  buttonLabel.text = @" ";
}

- (void)text2; {
  buttonLabel.text = @"STOP";
}

- (IBAction)buttonPressed:(id)sender; {
  if ([buttonLabel.text isEqualToString:@"START"]) {
    int startTime = arc4random() % 10; // Find the random period of time to wait
    [NSTimer scheduledTimerWithTimeInterval:(float)startTime target:self selector:@selector(text2:) userInfo:nil repeats:NO];
  }
  else{
    // I put 1.0f by default, but you could use something more complicated if you want.
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(text1:) userInfo:nil repeats:NO];
  }
}

時間に基づいてラベルをどのように更新するかは正確にはわかりませんが、さらにコードを投稿したり、例を挙げたりすると、その方法についてコードを投稿しますがNSTimer、 。お役に立てば幸いです。

于 2011-09-30T17:14:29.530 に答える
1

A の答えは次のようになります。

ランダムな時間が経過したら (@MSgambel に良い提案があります)、次のコマンドを実行します。

timer = [NSTimer scheduledTimerWithTimeInterval:kGranularity target:self selector:@selector(periodicallyUpdateLabel) userInfo:nil repeats:YES];

(上記の行は @MSgambel の -text2 メソッドに入る可能性があります。)

-periodicallyUpdateLabelこれにより、メソッドが毎秒 1 回kGranularity、繰り返し呼び出されます。その方法では、ラベルを更新したり、ユーザーの操作を確認したり、時間切れやその他の条件が満たされた場合にゲームを終了したりすることができます。

そして、ここに-periodicallyUpdateLabel方法があります:

- (void)periodicallyUpdateView {
    counter++;
    timeValueLabel.text = [NSString stringWithFormat:@"%02d", counter];
}

必要なものを得るには、テキストを別の形式にする必要があります。また、kGranularity を使用してカウンター値から時間に変換します。しかし、これは私が見つけたもので、iOS デバイスには非常に多くの CPU サイクルしかありません。マイクロ秒レベルまで下げようとすると、インターフェイスが遅くなり、表示される時間が実際の時間からずれ始めました。つまり、ラベルの更新を 100 分の 1 秒または 10 分の 1 秒に 1 回に制限する必要がある場合があります。実験。

于 2011-09-30T17:34:37.537 に答える