如何在xcode上使NSTimer保持一致

时间:2014-08-08 09:59:33

标签: ios xcode

我正在制作游戏,并希望使用计时器倒计时事件,就像在宝石迷阵上看到的那样。我知道我必须将NSTimer放入NSRunLoop才能使其正常工作,因为NSTimer是不准确的。尝试了以下但仍然无法正常工作。请帮忙!

#import ...
NSTimer *_gameTimer;
int secondsLeft;

//some code
//called countdownTimer using [self countdownTimer];

- (void)countdownTimer
{
    _gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
    NSRunLoop *gameRun = [NSRunLoop currentRunLoop];
    [gameRun addTimer:_gameTimer forMode:NSDefaultRunLoopMode];
}

- (void)updateTime:(NSTimer *)timer
{
     if (secondsLeft>0 && !_gameOver) {
     _timerLabel.text = [NSString stringWithFormat:@"Time left: %ds", secondsLeft];
     secondsLeft--;
} else if (secondsLeft==0 && !_gameOver) {
     // Invalidate timer
     [timer invalidate];
     [self timerExpire];
     }
}

- (void)timerExpire
{
    // Gameover
    [self gameOver];

    [_gameTimer invalidate];
    _gameTimer = nil;
}

1 个答案:

答案 0 :(得分:0)

NSTimer需要是一个局部变量,因此只能有一个对象的实例在循环中运行。这是代码。

- (void)countdownTimer
{
    NSTimer *_gameTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
    NSRunLoop *gameRun = [NSRunLoop currentRunLoop];
    [gameRun addTimer:_gameTimer forMode:NSDefaultRunLoopMode];

     if (secondsLeft==0 || _gameOver) {
        [_gameTimer invalidate];
        _gameTimer = nil;
    }
}

- (void)updateTime:(NSTimer *)timer
{
    if (secondsLeft>0 && !_gameOver) {
        _timerLabel.text = [NSString stringWithFormat:@"Time left: %ds", secondsLeft];
        secondsLeft--;
    } else if (secondsLeft==0 || _gameOver) {
        // Invalidate timer
        [timer invalidate];
        [self timerExpire];
}

- (void)timerExpire
{
    // Gameover
    [self gameOver];
}