1

试图找出我在尝试创建一个显示秒和毫秒的倒计时计时器时搞砸的地方。这个想法是计时器向更新 UILable 的 NSString 显示倒计时时间。

我目前拥有的代码是

-(void)timerRun {
    if (self.timerPageView.startCountdown) {
        NSLog(@"%i",self.timerPageView.xtime);

    self.timerPageView.sec = self.timerPageView.sec - 1;

    seconds = (self.timerPageView.sec % 60) % 60 ;
    milliseconds = (self.timerPageView.sec % 60) % 1000;


    NSString *timerOutput = [NSString stringWithFormat:@"%i:%i", seconds, milliseconds];
    self.timerPageView.timerText.text = timerOutput;

    if (self.timerPageView.resetTimer == YES) {
       [self setTimer];
}
}
    else {

    }


}

-(void)setTimer{
    if (self.timerPageView.xtime == 0) {
        self.timerPageView.xtime = 60000;
    }
    self.timerPageView.sec = self.timerPageView.xtime;
    self.timerPageView.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerRun) userInfo:Nil repeats:YES];
    self.timerPageView.resetTimer = NO;
}

    int seconds;
    int milliseconds;
    int minutes;
}

有人知道我做错了什么吗?

4

3 回答 3

4

您有一个每秒将执行大约 100 次的计时器(间隔为 0.01)。

1你每次递减一个值。因此,您的self.timerPageView.sec变量似乎是百分之一秒。

要获得秒数,您需要将此值除以 100。要获得毫秒数,您需要先乘以 10,然后再以 1000 为模。

seconds = self.timerPageView.sec / 100;
milliseconds = (self.timerPageView.sec * 10) % 1000;

更新:

另请注意,您的计时器非常不准确。计时器不会每百分之一秒重复一次。它可能每秒只能运行 80 次或其他一些不精确的速率。

更好的方法是在开始时获取当前时间。然后在您的timerRun方法中,您再次获得当前时间。减去两个数字。这将给出实际经过的时间。使用它而不是在每个循环中递减一个值。

于 2013-08-23T00:21:29.103 回答
3

这些计算看起来很可疑:

seconds = (self.timerPageView.sec % 60) % 60 ;
milliseconds = (self.timerPageView.sec % 60) % 1000;

您正在对浮点值使用 int 类型计算(在其实现中非常粗略)几秒钟。

   NSUInteger seconds = (NSUInteger)(self.timerPageView.sec * 100); //convert to an int
   NSUInteger milliseconds = (NSUInteger) ((self.timerPageView.sec - seconds)* 1000.);
于 2013-08-23T00:19:16.023 回答
3

您设置的时间间隔为 0.01,即每 10 毫秒,0.001 为每毫秒。
即便如此,NSTimer 也不是那么准确,你可能不会让它每 1 毫秒工作一次。它是从运行循环中触发的,因此存在延迟和抖动。

于 2013-08-23T00:20:37.250 回答