6

我正在尝试创建一个简单的倒数计时器,以便当玩家进入我的游戏时,计时器从 60 开始下降到 0。这看起来很简单,但我对如何编写这个感到困惑。

到目前为止,我在 GameController.m 中创建了一个方法,如下所示:

-(int)countDownTimer:(NSTimer *)timer {
    [NSTimer scheduledTimerWithTimeInterval:-1
                                 invocation:NULL
                                    repeats:YES];
    reduceCountdown = -1;
    int countdown = [[timer userInfo] reduceCountdown];
    if (countdown <= 0) {
        [timer invalidate];
    }
    return time;
}

在游戏开始时,我将整数 Time 初始化为 60。然后在 ViewController 中设置标签。但是在我编译代码的那一刻,它只是在 60 处显示标签并且根本没有减少。

任何帮助将不胜感激 - 我是 Objective-C 的新手。


编辑

在一些帮助下,我现在将代码分成 2 个单独的方法。代码现在如下所示:

-(void)countDown:(NSTimer *)timer {
    if (--time == 0) {
        [timer invalidate];
        NSLog(@"It's working!!!");
    }
}

-(void)countDownTimer:(NSTimer *)timer {
    NSLog(@"Hello");
    [NSTimer scheduledTimerWithTimeInterval:1
                                      target:self
                             selector:@selector(countDown:)
                                      userInfo:nil
                                      repeats:YES];
}

但是,代码仍然无法正常运行,当我从视图控制器调用方法 [game countDownTimer] 时,它会中断说:“无法识别的选择器已发送到实例”。任何人都可以解释这里有什么问题吗?

4

3 回答 3

12

您的代码有几个问题:

  • 您为时间间隔传递了错误的参数- 负数被解释为 0.1 毫秒
  • 您正在调用错误的重载- 您应该传递一个调用对象,但您正在传递一个NULL
  • 您将要在计时器上执行的代码与计时器初始化放在一起- 需要在计时器上执行的代码应该放在单独的方法中。

您应该调用采用选择器的重载,并传递1间隔,而不是-1.

声明NSTimer *timerand int remainingCounts,然后添加

timer = [NSTimer scheduledTimerWithTimeInterval:1
                                         target:self
                                       selector:@selector(countDown)
                                       userInfo:nil
                                        repeats:YES];
remainingCounts = 60;

到要开始倒计时的地方。然后添加 countDown 方法本身:

-(void)countDown {
    if (--remainingCounts == 0) {
        [timer invalidate];
    }
}
于 2013-03-09T13:49:06.380 回答
2

试试这个

- (void)startCountdown
{
    _counter = 60;

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                      target:self
                                                    selector:@selector(countdownTimer:)
                                                    userInfo:nil
                                                     repeats:YES];
}

- (void)countdownTimer:(NSTimer *)timer
{
    _counter--;
    if (_counter <= 0) { 
        [timer invalidate];
        //  Here the counter is 0 and you can take call another method to take action
        [self handleCountdownFinished];
   }
}
于 2013-03-09T13:51:27.030 回答
1

根据您提出的问题。您可以通过每 1 秒调用一个函数并处理其中的递减逻辑来实现这一点。

片段:-

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1.0
                      target: self
                      selector:@selector(onTick:)
                      userInfo: nil repeats:YES];
(void)onTick
{
   //do what ever you want
   NSLog(@"i am called for every 1 sec");
//invalidate after 60 sec [timer invalidate];
}
于 2013-03-09T13:46:38.190 回答