暂停并停止方法

时间:2013-08-24 17:20:30

标签: ios objective-c nstimer

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

- (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 个答案:

答案 0 :(得分:0)

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

可以找到相关示例here

修改

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

一般实施:

  • 开始时应仅标记计时器启动。另请注意系统时钟的当前时间。 (这是可选的)
  • 定时器功能应改变时间变量的值,并将其与秒表设定值进行比较。如果时间已过去==设置值,请使用invalidate停止计时器。
  • 停止应该中断定时器并将其停止,并且经过时间值也应设置为0.如果您不想再次重复使用同一时间值,则应重置时间变量。

答案 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;
}