我有一个in值设置为10。a然后用下面的代码运行一个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] 00将永远持续下去。我太迷茫了,有什么帮助吗?
发布于 2012-06-05 23:39:05
所以奇怪的是,为什么要从int中减去.01。但是,当您这样做时,结果会被截断为int。因此,如果从9中减去.01,得到8.99,但是int不能存储8.99,所以它被简单地存储为8。一旦降到0,它就会做同样的事情。0- .01 = -0.01,它被截断为0。所以你总能从那次任务中得到零。
相反,可以尝试这样的方法:
timeLeft = timeLeft - 1;
甚至更好
timeLeft --;
上述任一项都将继续将整数降至零以下,例如:-1、-2、-3.当然,假设它是一个未签名的int ( 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不能保证在指定的时间间隔内调用它。基本上,它检查每个run循环是否应该触发,然后在适当的情况下这样做。但是,您绝不能比运行循环更频繁地触发NSTimer。这意味着,如果运行循环花费的时间比正常时间长,或者时间间隔太短,它可能在触发之前跳过几个时间间隔。因此,通过减少一个数字来计算“时间”(就像你似乎正在做的那样)是行不通的。相反,您需要找到另一种方法,比如在启动计时器时设置一个启动NSDate变量,然后根据开始时间检查每个计时器上的当前时间。
NSDate在其计算中返回相当细的粒度。因此,如果您选择了一个开始日期,您可以通过以下操作获得自该日期起的时间间隔:
NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:startDate];
NSTimeInterval是double。所以你可以把它转换成这样的字符串:
NSString *string = [NSString stringWithFormat:@"%f", interval];
或者限制小数位:
NSString *string = [NSString stringWithFormat:@"%.2f", interval];
这应该会给你你想要的东西。
https://stackoverflow.com/questions/10906374
复制相似问题