我正在制作秒表,但我只有启动按钮。按下开始按钮时,它进入一个循环:
- (void)stopwatch
{
NSInteger hourInt = [hourLabel.text intValue];
NSInteger minuteInt = [minuteLabel.text intValue];
NSInteger secondInt = [secondLabel.text intValue];
if (secondInt == 59) {
secondInt = 0;
if (minuteInt == 59) {
minuteInt = 0;
if (hourInt == 23) {
hourInt = 0;
} else {
hourInt += 1;
}
} else {
minuteInt += 1;
}
} else {
secondInt += 1;
}
NSString *hourString = [NSString stringWithFormat:@"%02d", hourInt];
NSString *minuteString = [NSString stringWithFormat:@"%02d", minuteInt];
NSString *secondString = [NSString stringWithFormat:@"%02d", secondInt];
hourLabel.text = hourString;
minuteLabel.text = minuteString;
secondLabel.text = secondString;
CGRect hourFrame = self->hourBar.frame;
CGRect minuteFrame = self->minuteBar.frame;
CGRect secondFrame = self->secondBar.frame;
if ((NSInteger)hourFrame.size.height != hourInt) { // check if we need to modify
hourFrame.origin.y -= ((hourInt * 10.0) - hourFrame.size.height);
hourFrame.size.height = (hourInt * 10.0);
self->hourBar.frame = hourFrame;
}
if ((NSInteger)minuteFrame.size.height != minuteInt) { // check if we need to modify
minuteFrame.origin.y -= ((minuteInt * 4.0) - minuteFrame.size.height);
minuteFrame.size.height = (minuteInt * 4.0);
self->minuteBar.frame = minuteFrame;
}
if ((NSInteger)secondFrame.size.height != secondInt) { // check if we need to modify
secondFrame.origin.y -= ((secondInt * 4.0) - secondFrame.size.height);
secondFrame.size.height = (secondInt * 4.0);
self->secondBar.frame = secondFrame;
}
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(stopwatch) userInfo:nil repeats:NO];
}
当按下停止按钮时,我希望暂停此循环,以便当用户按下开始时,它会恢复秒表。
按下重置按钮时,我希望循环停止并重置为0.
如果你能尽可能简单地回答,那真的很棒,因为我只是一个初学者!
答案 0 :(得分:0)
循环是此类操作的错误构造。为了更好地控制,请使用NSTimer。
可以找到相关示例here。
修改强>
我的上述答案基于您问题的先前版本。
所以是的,NSTimer
应该是你的循环的控制因素,而不是循环的一部分。
一般实施:
invalidate
停止计时器。答案 1 :(得分:0)
你应该从你的'循环'方法中取出计时器并重复它。这应该是驱动秒表的事情,而不是你已经开始“循环”的事实。然后,您可以在需要时停止计时器并在以后重新启动计时器。您还可以谷歌找出暂停计时器的正确方法(您需要更改计时器以在指定的开火日期开始100%准确,但只知道剩下多少秒可能足够您的情况)。
答案 2 :(得分:0)
基于your previous question,听起来您已将计时器移出stopwatch
方法之外。请记住,计时器和循环是两个非常不同的事物。
您可以通过调用invalidate
来停止NSTimer
。有关详细信息,请阅读Apple's documentation。
答案 3 :(得分:0)
一种可能不是完全线程安全的方法,但我只是对其进行了测试,它的工作原理是当您单击start
时设置为true的变量,单击stop
时设置为false。 / p>
例如,在我的.h
中,我添加了@property (nonatomic) BOOL go;
,然后作为您提供的方法的第一行,添加如下所示的if检查:
- (void)stopwatch {
if (!self.go) return;
//..do the rest of your stopwatch code
//the timer call
}
然后我的开始和停止按钮调用如下:
- (void)start {
if (!self.go) { // Do not call the stopwatch method again if it is already going.
self.go = YES;
[self stopwatch];
}
}
- (void)stop {
self.go = NO;
}