1

inの値を10に設定しました。次に、次のコードでNSTimerを実行します。 [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; 私のvoidは次のようになります。

  -(void)updateTimer {
         timeLeft = timeLeft -0.01;
         NSString *string = [NSString stringWithFormat:@"%i",timeLeft];
         [timer setString:string];
         NSLog(string);

     }

私はCoco2Dを使用していますが、これは問題ではありません 私のログでは次のように表示されます

2012-06-05 17:28:56.030 NumberPop[31291:10a03] 9
2012-06-05 17:28:57.030 NumberPop[31291:10a03] 8
2012-06-05 17:28:58.030 NumberPop[31291:10a03] 7
2012-06-05 17:28:59.030 NumberPop[31291:10a03] 6
2012-06-05 17:29:00.030 NumberPop[31291:10a03] 5
2012-06-05 17:29:01.030 NumberPop[31291:10a03] 4
2012-06-05 17:29:02.030 NumberPop[31291:10a03] 3
2012-06-05 17:29:03.030 NumberPop[31291:10a03] 2
2012-06-05 17:29:04.029 NumberPop[31291:10a03] 1
2012-06-05 17:29:05.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:06.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:07.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:08.030 NumberPop[31291:10a03] 0
2012-06-05 17:29:09.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:10.030 NumberPop[31291:10a03] 0
2012-06-05 17:29:11.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:12.029 NumberPop[31291:10a03] 0

0は永遠に続きます。私はとても迷っています、何か助けはありますか?

4

1 に答える 1

9

したがって、intから.01を減算しようとしている理由については不思議です。ただし、これを行うと、結果はintに切り捨てられます。したがって、9から.01を引くと、8.99になりますが、intは8.99を格納できないため、単純に8として格納されます。0に下がると、同じことが行われます。0-.01 = -0.01、これは0に切り捨てられます。したがって、その割り当てから常にゼロが得られます。

代わりに、次のようなものを試してください。

timeLeft = timeLeft - 1;

またはさらに良い

timeLeft --;

上記のいずれかは、ゼロ未満の整数をデクリメントし続けます。例:-1、-2、-3 ....もちろん、それがunsigned int(つまりint)であると仮定します。

また、タイマーをゼロで停止しようとしている場合は、残り時間がゼロに達したときにタイマーを無効にする必要があります。詳細については、こちらをご覧ください:https ://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nstimer_Class/Reference/NSTimer.html#//apple_ref/occ/instm/NSTimer/invalidate

基本的に、次のようなことを行います。

timeLeft --;
if (timeLeft <= 0) [timer invalidate];

ただし、理解しておくべき重要なことがあります。NSTimerは、指定した時間間隔で呼び出されることを保証しません。基本的に、各実行ループで起動する必要があるかどうかをチェックし、必要に応じて実行します。ただし、実行ループよりも頻繁にNSTimerを起動することはできません。これは、実行ループに通常よりも時間がかかる場合、または時間間隔が短すぎる場合、起動する前にいくつかの間隔をスキップする可能性があることを意味します。したがって、(あなたがしているように見えるように)数値を減らすことによって「時間」を数えることは機能しません。代わりに、タイマーの開始時に開始NSDate変数を設定し、各タイマーの現在の時刻を開始時刻と照合するなど、別の方法を見つける必要があります。

NSDateは、計算でかなり細かい粒度を返します。したがって、開始日を取得する場合は、次のようにすることで、その日付からの時間間隔を取得できます。

NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:startDate];

NSTimeIntervalはdoubleです。したがって、次のような文字列に変換できます。

NSString *string = [NSString stringWithFormat:@"%f", interval];

または小数点以下の桁数を制限するには:

NSString *string = [NSString stringWithFormat:@"%.2f", interval];

これはあなたが探しているものをあなたに与えるはずです。

于 2012-06-05T23:39:05.317 に答える