0

我正在制作秒表,但我只有开始按钮工作。当按下开始按钮时,它进入一个循环:

- (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。

如果您可以使您的答案尽可能简单,那将非常棒,因为我只是一个初学者!

4

4 回答 4

0

根据您之前的问题,听起来您已将计时器移到您的stopwatch方法之外。请记住,计时器和循环是两个非常不同的东西。

你可以NSTimer通过调用它来停止invalidate它。请阅读Apple 的文档以获取更多详细信息。

于 2013-08-24T17:34:09.210 回答
0

您应该将计时器从“循环”方法中取出并使其重复。它应该是驱动秒表的东西,而不是你已经开始“循环”的事实。然后,您可以在需要时停止计时器并稍后重新启动它。您也可以通过谷歌找到暂停计时器的正确方法(您需要更改计时器以在指定的触发日期开始以 100% 准确,但只知道还剩多少秒可能就足够了)。

于 2013-08-24T17:25:32.017 回答
0

一种可能不是完全线程安全的方法,但我刚刚对其进行了测试,它的工作原理是让一个变量在单击时设置为 true,在单击时设置为startfalse stop

例如,在 my 中.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;
}
于 2013-08-24T17:36:47.130 回答
0

对于此类操作,循环是错误的构造。为了更好地控制,请使用NSTimer

一个相关的例子可以在这里找到。

编辑:

我的上述答案是基于您问题的先前版本。所以是的,NSTimer应该是循环的控制对象,而不是循环的一部分。

一般实现:

  • 开始应该只标记计时器开始。还要注意系统时钟的当前时间。(虽然这是可选的)
  • 计时器功能应更改时间变量的值,并将其与秒表设定值进行比较。如果经过时间 == 设置值,则使用 停止计时器invalidate
  • 停止应该中断计时器并停止它,并且经过的时间值应该设置为 0。如果您不想再次重复使用相同的时间值,也应该重置时间变量。
于 2013-08-24T17:24:14.987 回答