我想创建一个倒计时60秒的计时器,并在剩下的时间内更新UILabel。
到目前为止我有这个,但是如何将int连接到剩下的时间?
-(IBAction)startTimer
{
NSTimer *myTimer;
myTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
}
- (void)countDown
{
counterInt--;
myLabel.text = [NSString stringWithFormat:@"%i", counterInt];
}
答案 0 :(得分:2)
NSTimer不适合需要精确时间测量的应用程序。您指定的时间间隔只是一个目标,并且不保证NSTimer在此时准确触发。它试图达到你指定的目标,但特别是如果处理器处理很多,NSTimer准确度会恶化。
要准确测量时间,您需要使用NSDate记录开始时间,然后按照您的方式运行NSTimer,但不要假设确切的秒已经过去,请将您的函数与当前时间进行比较开始时间,这将为您提供准确的测量。
答案 1 :(得分:1)
你传递的timeInterval
为60秒,所以它会每60秒触发一次,而不是每1秒触发60秒。所以它应该是,
myTimer = [[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(countDown:)
userInfo:nil
repeats:YES] retain];
另一件事是,在您的目的完成后,您不会使警报无效。因此,请检查counterInt
值是否已达到零并使其无效。由于还有其他好处,使myTimer
成为实例变量。
- (void)countDown:(NSTimer *)aTimer {
counterInt--;
myLabel.text = [NSString stringWithFormat:@"%i", counterInt];
if ( counterInt <= 0 ) {
[myTimer invalidate];
[myTimer release];
myTimer = nil;
}
}
此外,您没有处理秒表已经开始的情况。该部分应该在您的界面操作方法
中处理-(IBAction)startTimer:(UIButton *)sender
{
if ( myTimer ) {
/* Timer exists so handle that as appropriate */
[myTimer invalidate];
[myTimer release];
myTimer = nil;
[sender setTitle:@"Start" forControlState:UIControlStateNormal];
} else {
myTimer = [[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countDown) userInfo:nil repeats:YES] retain];
counterInt = 60;
[sender setTitle:@"Stop" forControlState:UIControlStateNormal];
}
}
修改强>
我已编辑了更改方法的答案,以将NSTimer
实例作为参数。您必须相应地更新方法定义。也更新代码。
因此counterInt
是你应该声明为实例变量的东西。
答案 2 :(得分:0)