【问题标题】:Stop NSTimer when float is 0float 为 0 时停止 NSTimer
【发布时间】:2011-03-06 22:58:25
【问题描述】:

我有一个 NSTimer 和一个显示倒计时的标签。

-(void)start {

myTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];

}

-(IBAction)stop {

[myTimer invalidate];

}

-(void)showActivity {

currentTime = [timeLabel.text floatValue];
currentTime -= 0.01;
timeLabel.text = [NSString stringWithFormat:@"%.2f", currentTime];  

if (currentTime == 0) {

    [self stop];

    ResultViewController *screen = [[ResultViewController alloc] initWithNibName:nil bundle:nil];
    screen.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:screen animated:YES];
    [screen release];
}

}

- (void)viewDidLoad {
[super viewDidLoad];
timeLabel.text = @"60.0";
[self start];

}

所以当时间为 0 时,计时器应该停止并且 ResultViewController 应该加载,但是当我这样做时,计时器仍然倒计时到负数并且没有任何反应。

有人可以帮我吗?

谢谢你:)

【问题讨论】:

    标签: objective-c ios4 floating-point nstimer


    【解决方案1】:

    0.01 没有精确的浮点二进制表示,因此您的浮点数永远不会完全为零。在比较中使用

    【讨论】:

      【解决方案2】:

      试试这样的:

      if(currentTime <= 0.0)
           ...
      

      您正在遭受的是浮点漂移。这是众所周知的现象。

      【讨论】:

        【解决方案3】:

        浮点运算通常不是“精确”的(请参阅http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems)。把支票改成if (currentTime &lt;= 0.0)就没事了。

        【讨论】:

          【解决方案4】:

          并非所有数字都可以用浮点变量准确存储。就像 1/3 不能用以 10 为底的有限数字表示一样,1/10 也不能用以 2 为底的有限数字表示。你最终得到的结果是四舍五入到 0.10000000000000001 或接近。所以当你从中减去 0.1 时,你不会得到 0。

          对此最可靠的解决方案是将您的时间以毫秒为单位存储在一个整数中,并在您想要更新标签时将其除以。也不要费心从标签到数字来回走动。数字的规范存储应该是数字。标签只是为了显示它。

          编辑:

          对于每个建议他改成&lt;= 的人来说——这只是一个勉强凑合的小技巧。 0.1 的浮点表示通常是 0.10000000000000001。减去 0.1 会发生什么?它仍然高于 0。条件仅在接近 -0.1 时触发,这不是应用程序的预期行为。这是一个糟糕的解决方案。

          【讨论】:

            【解决方案5】:

            ResultViewController 应该只分配 init 而不是将 alloc initWithNibName 设置为 nil。

            当前时间比较应输入if (currentTime &lt;= (float)0.0)或类似(原因参考:this thread

            【讨论】:

              【解决方案6】:

              最好不要与 int 比较。尝试这样做:

              if (currentTime == 0.0) {
              

              【讨论】:

              • 这无济于事——currentTime 永远不会是零。
              猜你喜欢
              • 1970-01-01
              • 2013-01-30
              • 2010-11-05
              • 2015-12-08
              • 2011-03-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多