1

我将 in 值设置为 10。然后使用以下代码运行 NSTimer: [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; 我的 void 看起来像这样

  -(void)updateTimer {
         timeLeft = timeLeft -0.01;
         NSString *string = [NSString stringWithFormat:@"%i",timeLeft];
         [timer setString:string];
         NSLog(string);

     }

我正在使用 Coco2D,这不是问题 在我的日志中它是这样的

2012-06-05 17:28:56.030 NumberPop[31291:10a03] 9
2012-06-05 17:28:57.030 NumberPop[31291:10a03] 8
2012-06-05 17:28:58.030 NumberPop[31291:10a03] 7
2012-06-05 17:28:59.030 NumberPop[31291:10a03] 6
2012-06-05 17:29:00.030 NumberPop[31291:10a03] 5
2012-06-05 17:29:01.030 NumberPop[31291:10a03] 4
2012-06-05 17:29:02.030 NumberPop[31291:10a03] 3
2012-06-05 17:29:03.030 NumberPop[31291:10a03] 2
2012-06-05 17:29:04.029 NumberPop[31291:10a03] 1
2012-06-05 17:29:05.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:06.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:07.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:08.030 NumberPop[31291:10a03] 0
2012-06-05 17:29:09.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:10.030 NumberPop[31291:10a03] 0
2012-06-05 17:29:11.029 NumberPop[31291:10a03] 0
2012-06-05 17:29:12.029 NumberPop[31291:10a03] 0

0 永远持续下去。我很迷茫,有什么帮助吗?

4

1 回答 1

9

所以很好奇你为什么要从 int 中减去 .01。但是当你这样做时,结果会被截断为一个 int。因此,如果你从 9 中减去 0.01,你会得到 8.99,但 int 不能存储 8.99,所以它会简单地存储为 8。一旦你降到 0,它就会做同样的事情。0 - .01 = -0.01,被截断为 0。所以你总是会从那个作业中得到零。

相反,尝试这样的事情:

timeLeft = timeLeft - 1;

甚至更好

timeLeft --;

上述任何一项都将继续减少低于零的整数,例如:-1、-2、-3....当然,假设它是一个无符号整数(即int)。

此外,如果您希望将计时器停止为零,则需要在剩余时间达到零时使其无效。在这里查看更多信息:https ://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nstimer_Class/Reference/NSTimer.html#//apple_ref/occ/instm/NSTimer/invalidate

基本上,做这样的事情:

timeLeft --;
if (timeLeft <= 0) [timer invalidate];

不过,有一些重要的事情需要理解。NSTimer 不保证它会在您指定的时间间隔准确地被调用。基本上,它会检查每个运行循环是否应该触发,然后在适当的时候触发。但是你永远不能比运行循环更频繁地触发 NSTimer。这意味着如果运行循环花费的时间比正常时间长或您的时间间隔太短,它可能会在触发之前跳过几个间隔。因此,通过减少一个数字(就像你似乎正在做的那样)来计算“时间”是行不通的。相反,您需要找到另一种方法,例如在启动计时器时设置一个起始 NSDate 变量,然后检查每个计时器触发的当前时间与开始时间。

NSDate 在其计算中返回相当精细的粒度。因此,如果您选择开始日期,则可以通过执行以下操作获取自该日期以来的时间间隔:

NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:startDate];

NSTimeInterval 是一个double. 所以你可以把它转换成这样的字符串:

NSString *string = [NSString stringWithFormat:@"%f", interval];

或限制小数位:

NSString *string = [NSString stringWithFormat:@"%.2f", interval];

这应该给你你正在寻找的东西。

于 2012-06-05T23:39:05.317 回答