0

I searched around the internet for an answer but with no luck. I tried

- (void)viewDidLoad {

[super viewDidLoad];

twoMinTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timer) userInfo:nil repeats:YES]; }

- (void)timer {
for (int totalSeconds = 120; totalSeconds > 0; totalSeconds--){

timerLabel.text = [self timeFormatted:totalSeconds];

if ( totalSeconds == 0 ) {

   [twoMinTimer invalidate];

   } } }

but it didn't work, the label went from 2.00 to 0.01 when I went to that view and then it just stopped.

Any advice would be greatly appreciated - Philip

4

1 に答える 1

7

単に合計時間をデクリメントするのではなく、1回限りのforループを使用しています。これを試して:

- (void)viewDidLoad {

    [super viewDidLoad];
    totalSeconds = 120;
    twoMinTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                   target:self
                                                 selector:@selector(timer)
                                                 userInfo:nil
                                                  repeats:YES];
}

- (void)timer {
    totalSeconds--;
    timerLabel.text = [self timeFormatted:totalSeconds];
    if ( totalSeconds == 0 ) {
        [twoMinTimer invalidate];
    } 
}

totalSecondsintとして宣言します。

編集:@JoshCaswellと@MichaelDorstにそれぞれ提案とコードフォーマットを提供してくれて本当にありがとう。NSTimerは決して正確な時間を表すものではなく、ストップウォッチやカウンターとしては十分に正確ではありません。代わりに、NSDate+dateSinceNowはより正確な代替、または段階的に低いレベルCFAbsoluteTimeGetCurrent()で さえあり、mach_absolute_time()サブミリ秒まで正確です。

于 2012-07-07T18:37:27.153 に答える