我的值设置为10.然后使用此代码运行NSTimer:
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];
My void看起来像这样
-(void)updateTimer {
timeLeft = timeLeft -0.01;
NSString *string = [NSString stringWithFormat:@"%i",timeLeft];
[timer setString:string];
NSLog(string);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用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
Run Code Online (Sandbox Code Playgroud)
0 永远继续下去.我迷路了,有什么帮助吗?
所以你好奇为什么要尝试从int中减去.01.但是当你这样做时,结果会被截断为int.因此,如果从9中减去.01,则得到8.99但是int不能存储8.99,因此它只能存储为8.一旦你得到0,它就会做同样的事情.0 - .01 = -0.01,被截断为0.所以你总是从那个赋值中得到零.
相反,尝试这样的事情:
timeLeft = timeLeft - 1;
甚至更好
timeLeft --;
上述任何一个都将继续递减零以下的整数,例如:-1,-2,-3 ....当然,假设它是一个unsigned 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];
Run Code Online (Sandbox Code Playgroud)
但是有一些重要的事情要理解.NSTimer不保证在您指定的时间间隔内调用它.基本上,它会检查每个运行循环是否应该触发,然后在适当的情况下执行此操作.但是你永远不会比运行循环更频繁地发射NSTimer.这意味着如果运行循环花费的时间比正常时间长或者您的时间间隔太短,它可能会在激发之前跳过几个时间间隔.因此,通过递减数字来计算"时间"(就像你似乎正在做的那样)是行不通的.相反,您需要找到另一种方法,例如在启动计时器时设置起始NSDate变量,然后根据开始时间检查每个计时器触发时的当前时间.
NSDate在其计算中返回相当精细的粒度.因此,如果你采取开始日期,你可以通过这样做获得自该日期以来的时间间隔:
NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:startDate];
NSTimeInterval是一个double.所以你可以把它转换成这样的字符串:
NSString *string = [NSString stringWithFormat:@"%f", interval];
或限制小数位:
NSString *string = [NSString stringWithFormat:@"%.2f", interval];
这应该会给你你想要的东西.