需要帮助NSTimer制作秒表

时间:2011-06-27 22:41:10

标签: iphone objective-c cocoa-touch nstimer

我想创建一个倒计时60秒的计时器,并在剩下的时间内更新UILabel。

到目前为止我有这个,但是如何将int连接到剩下的时间?

-(IBAction)startTimer
{
    NSTimer *myTimer;
    myTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(countDown) userInfo:nil repeats:YES]; 
}

- (void)countDown
{
    counterInt--;
    myLabel.text = [NSString stringWithFormat:@"%i", counterInt];
}

3 个答案:

答案 0 :(得分:2)

NSTimer不适合需要精确时间测量的应用程序。您指定的时间间隔只是一个目标,并且不保证NSTimer在此时准确触发。它试图达到你指定的目标,但特别是如果处理器处理很多,NSTimer准确度会恶化。

要准确测量时间,您需要使用NSDate记录开始时间,然后按照您的方式运行NSTimer,但不要假设确切的秒已经过去,请将您的函数与当前时间进行比较开始时间,这将为您提供准确的测量。

答案 1 :(得分:1)

你传递的timeInterval为60秒,所以它会每60秒触发一次,而不是每1秒触发60秒。所以它应该是,

myTimer = [[NSTimer scheduledTimerWithTimeInterval:1 
                                            target:self
                                          selector:@selector(countDown:) 
                                          userInfo:nil 
                                           repeats:YES] retain];

另一件事是,在您的目的完成后,您不会使警报无效。因此,请检查counterInt值是否已达到零并使其无效。由于还有其他好处,使myTimer成为实例变量。

- (void)countDown:(NSTimer *)aTimer {
    counterInt--;
    myLabel.text = [NSString stringWithFormat:@"%i", counterInt];

    if ( counterInt <= 0 ) {
        [myTimer invalidate];
        [myTimer release];
        myTimer = nil;
    }
}

此外,您没有处理秒表已经开始的情况。该部分应该在您的界面操作方法

中处理
-(IBAction)startTimer:(UIButton *)sender
{
    if ( myTimer ) {
        /* Timer exists so handle that as appropriate */
        [myTimer invalidate];
        [myTimer release];
        myTimer = nil;

        [sender setTitle:@"Start" forControlState:UIControlStateNormal];
    } else {
        myTimer = [[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countDown) userInfo:nil repeats:YES] retain]; 
        counterInt = 60;

        [sender setTitle:@"Stop" forControlState:UIControlStateNormal];
    }
}

修改

我已编辑了更改方法的答案,以将NSTimer实例作为参数。您必须相应地更新方法定义。也更新代码。

因此counterInt是你应该声明为实例变量的东西。

答案 2 :(得分:0)