Обратный отсчет Xcode 5 NSTimer удаляет 2 жизни вместо 1

Здравствуйте, я пытаюсь сделать продвинутую игру-викторину, которая ведет обратный отсчет. 5 секунд на каждый вопрос, на который нужно ответить, и присвоение соответствующего количества баллов, например, 10, если на него ответили за 5 секунд, 5 за 3 секунды и 1, если за 1 секунду, но моя главная проблема заключается в том, что счетчик работает, и метод, который я вызываю, для удаления живого и начать с неправильного ответа, все работает, но внезапно иногда он удаляет около 2 жизней вместо 1 и выходит за установленный предел 0 для игры более чем -2 жизни, я не могу понять, может кто-нибудь помочь мне? был бы очень признателен и немного нуб в кодировании. вот код, который я использую в моем файле game.m

///////таймер//////////////

-(void) timerRun {

    secondsCount = secondsCount - 1;
    //int minuts = secondsCount /60;
    int seconds = secondsCount;// - (minuts * 60);

    NSString *timerOutput = [NSString stringWithFormat:@"%.2d" ,  seconds];
    countDownLaber.text = timerOutput;

    if (secondsCount == 0) {
        [countDownTimer invalidate];
        countDownTimer = nil;

        [self LoseByTime];
    }    
}


-(void) setTimer{

    secondsCount = 5;
    countDownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerRun) userInfo:nil repeats:YES];

}

///////////////таймер ////////////////////

-(void)LoseByTime{

    LivesNumber = LivesNumber - 1;
    Lives.text = [NSString stringWithFormat:@"%i" , LivesNumber];

}




-(void)RightAnswer{

    ScoreNumber = ScoreNumber + 50;
    Score.text = [NSString stringWithFormat:@"%i" , ScoreNumber];
    NextCategory.hidden = NO;
    Answer1.hidden = YES;
    Answer2.hidden = YES;
    Answer3.hidden = YES;
    Answer4.hidden = YES;
    QuestionText.hidden = NO;
    CategorySelected.hidden = YES;
    //Result.hidden = NO;
    //Result.image = [UIImage imageNamed:@"transparentPic.png"];

}


-(void)WrongAnswer{

    LivesNumber = LivesNumber - 1;
    Lives.text = [NSString stringWithFormat:@"%i" , LivesNumber];
    NextCategory.hidden = NO;
    Answer1.hidden = YES;
    Answer2.hidden = YES;
    Answer3.hidden = YES;
    Answer4.hidden = YES;
    QuestionText.hidden = NO;
    CategorySelected.hidden = YES;
    //Result.hidden = NO;
    //Result.image = [UIImage imageNamed:@"transparentPic.png"];


    if (LivesNumber == 0) {

        Result.image = [UIImage imageNamed:@"gameOver.png"];
        NextCategory.hidden = YES;
        Exit.hidden = NO;
        GameInProgress = NO;

    }



}


- (IBAction)Answer1:(id)sender;{

    if (Answer1Correct == YES) {
        [self RightAnswer];
        right1.hidden = NO;

    }
    else{
        [self WrongAnswer];
        wrong1.hidden = NO;


    }

}

- (IBAction)Answer2:(id)sender;{

    if (Answer2Correct == YES) {
        [self RightAnswer];
        right2.hidden = NO;



    }
    else{
        [self WrongAnswer];
        wrong2.hidden = NO;



    }

}

- (IBAction)Answer3:(id)sender;{

    if (Answer3Correct == YES) {
        [self RightAnswer];
        right3.hidden = NO;



    }
    else{
        [self WrongAnswer];
        wrong3.hidden = NO;


    }
}

- (IBAction)Answer4:(id)sender;{

    if (Answer4Correct == YES) {
        [self RightAnswer];
        right4.hidden = NO;



    }
    else{
        [self WrongAnswer];
        wrong4.hidden = NO;



    }

}

person Simos Laftsoglou    schedule 03.06.2014    source источник
comment
где ваш код, который вызывает setTimer? Похоже, вы вызываете его дважды, что создает еще один таймер без того, чтобы вы сначала аннулировали его. Может объяснить, почему у вас иногда удаляются сразу 2 жизни.   -  person LyricalPanda    schedule 04.06.2014


Ответы (2)


В setTimer я бы рекомендовал аннулировать и очистить countDownTimer, чтобы гарантировать, что в каждый момент времени существует только один таймер. Поскольку в настоящее время таймер сбрасывается только тогда, когда счетчик секунд равен нулю, существует вероятность того, что setTimer будет вызван до того, как это произойдет.

person NigelG    schedule 03.06.2014

Привет и спасибо за ответ, который я сейчас понял, добавив [countDownTimer invalidate]; countDownTimer = ноль; к другим моим методам, а также к моему «При неправильном ответе и в случае, если живет == 0, и, похоже, это помогает, я думаю, что это делало таймер недействительным, только если таймер был на 0, и не останавливал таймер, если вы нажмете неправильный ответ, поэтому неправильный ответ не останавливал таймер, который считал до 0, а затем также удалял прямую трансляцию, поэтому мне просто пришлось сделать недействительным таймер, даже когда был вызван другой метод. Хотя я все еще не понял, как сделать счет и таймер для подсчета очков в зависимости от того, сколько времени вы ответили :/

person Simos Laftsoglou    schedule 04.06.2014