如何暂停一个NSTimer?

5

我有一个使用计时器的游戏。我想让用户可以选择一个按钮来暂停计时器,当他们再次点击该按钮时,计时器将恢复。我已经有了计时器的代码,只需要一些帮助来实现暂停计时器和双动作按钮。

计时器的代码:

-(void)timerDelay {

    mainInt = 36;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                         target:self
                                       selector:@selector(countDownDuration)
                                       userInfo:nil
                                        repeats:YES];
}

-(void)countDownDuration {

    MainInt -= 1;

    seconds.text = [NSString stringWithFormat:@"%i", MainInt];
    if (MainInt <= 0) {
        [timer invalidate];
        [self delay];
    }

}

如果TBlue的回答对你有帮助,将其标记为正确是正确的。您不必将该代码编辑到您的问题中或在标题中添加[SOLVED]。我建议阅读[帮助]以了解更多关于在StackOverflow中发布的正确方式。 - madth3
2个回答

18

这非常简单。

// Declare the following variables
BOOL ispaused;
NSTimer *timer;
int MainInt;

-(void)countUp {
    if (ispaused == NO) {
        MainInt +=1;
        secondField.stringValue = [NSString stringWithFormat:@"%i",MainInt];
    }
}

- (IBAction)start1Clicked:(id)sender {
    MainInt=0;
    timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(countUp) userInfo:Nil repeats:YES];
}

- (IBAction)pause1Clicked:(id)sender {
    ispaused = YES;
}

- (IBAction)resume1Clicked:(id)sender {
    ispaused = NO;
}

4

NSTimer中没有暂停和恢复功能。您可以像下面的代码一样实现它。

- (void)startTimer
{
    m_pTimerObject = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self  selector:@selector(fireTimer:) userInfo:nil repeats:YES];
}

- (void)fireTimer:(NSTimer *)inTimer
{
    // Timer is fired.
}

- (void)resumeTimer
{
    if(m_pTimerObject)
    {
        [m_pTimerObject invalidate];
        m_pTimerObject = nil;        
    }
    m_pTimerObject = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self  selector:@selector(fireTimer:) userInfo:nil repeats:YES];
}

- (void)pauseTimer
{
    [m_pTimerObject invalidate];
    m_pTimerObject = nil;
}

6
这并不是暂停,它只是停止然后重新开始。 - Carl Veazey
正如答案所提到的,NSTimer中没有“暂停”功能,因此任何答案(包括被接受的答案)都必须解决这个问题。该答案比被接受的答案更好,因为它不会让一个没有什么价值的计时器继续运行。+1 - Nate Chandler
@Nate 在重复的答案中,似乎是围绕这个事实来解决问题并提供暂停功能的。我认为指出这一点并不过分。 - Carl Veazey
@Nate Chandler,感谢您指出这一点。我不理解的是,为什么会对一个明显正确的答案进行投票否决。当有人投票否决一个答案时,应该要求提供解释。 - Adrian P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接