iOS pong开发,计时器不会停止

时间:2012-01-10 14:40:41

标签: iphone objective-c ios timer

我正在制作一个简单的乒乓球比赛.. 现在我想设置一个计时器,它会在我松开后停止并可能将值保存到高分,但即使我设法设置计时器并让他开启,它似乎也不想停止。

我正在使用本教程实现它: http://www.apptite.be/tutorial_ios_stopwatch.php

现在我的代码看起来像这样:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (StavHry == StavHryPozastaven) {
        TapToBegin.hidden = YES;
        StavHry = StavHryAktivni;
    } else if (StavHry == StavHryAktivni) {
        [self touchesMoved:touches withEvent:event];
    }
    startDate = [NSDate date];

    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self selector:@selector(updateTimer)userInfo:nil repeats:YES];
} 

- (void)updateTimer
{
    static NSInteger counter = 0;
    StopWatchLabel.text = [NSString stringWithFormat:@"Counter: %i", counter++];

    NSDate *currentDate = [NSDate date];
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"HH:mm:ss.SSS"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    StopWatchLabel.text = timeString;
}

当我点击TapToBegin标签时,我设置了计时器.. 但是当我松开或赢得计时器时,即使我在设置新游戏之前在功能中使用了无效,我也会继续运行..(当我开始新游戏时,它会重置)

-(void)reset:(BOOL) novahra { //funkce reset
    self.StavHry = StavHryPozastaven;
    mic.center = self.view.center;
    if(novahra) {
        if(skore_hrac_hodnota < skore_pc_hodnota){
            TapToBegin.text = @"Protivnik Vyhrál, smůla!";
            [stopWatchTimer invalidate];
        } else {
            TapToBegin.text = @"Vyhráls! Gratulujem!";
            [stopWatchTimer invalidate];
        }
        skore_hrac_hodnota = 0;
        skore_pc_hodnota = 0;
    } else {
        self.StavHry = StavHryAktivni;
        //TapToBegin.text = @"Pokračuj!";
    }

    skore_hrac.text  = [NSString stringWithFormat:@"%d", skore_hrac_hodnota];
    skore_pc.text = [NSString stringWithFormat:@"%d", skore_pc_hodnota];
}

我知道教程显示了更多行代码,因为它的停止动作,但我尝试了更多的选项我给它所有的东西,但我认为这是唯一一个停止计时器的行,所以它应该工作。但事实并非如此。

请帮助,我星期一有一个应得的结果,所以我吓坏了一点。

1 个答案:

答案 0 :(得分:2)

如果多次调用touchesBegan:并且两者之间没有调用reset:,会发生什么?如果它可能发生,你可能会泄漏一个计时器,继续调用你的updateTimer方法。

如果您发布的代码作为计时器方法工作应该采取参数,我有点惊讶。这会将您的计时器选择器更改为@selector(updateTimer:),然后将方法更改为- (void)updateTimer:(NSTimer *)timer