Навсегда отключить таймеры - iOS Swift 4 - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь полностью перезагрузить игровую сцену после того, как игроку не удалось достичь цели через 10 секунд.

Я использую запланированную функцию таймера для отсчета секунд.

func runTimer() {
    time.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(GameScene_1.updateTimer)), userInfo: nil, repeats: true)
}

Вот вызываемая функция сверху:

@objc func updateTimer() {
    if time.seconds == 0 {
        //Lost the game - reload
        reloadLevel()

    }else{

        ...
    }
}

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

func reloadLevel(){
    //Reset
    time.seconds = 10
    time.timer = nil

    //Reload Level
    let newScene = GameScene_1(fileNamed: "GameScene_1")
    newScene?.scaleMode = self.scaleMode
    let animation = SKTransition.flipVertical(withDuration: 2)
    self.view?.presentScene(newScene!, transition: animation)
}

Эта функция runTimer () вызывается только один раз в моем проекте, и это когда пользователь заканчивает, чтобы коснуться экрана. До этого момента все было хорошо, но после этого кажется, что несколько таймеров начинают обратный отсчет сразу.

Кто-нибудь знает, как я могу перезагрузить сцену "чистым" способом, чтобы ничего из сцены до этого не было сохранено? ... или как я могу навсегда остановить / удалить предыдущий таймер?

Я пытался написать следующие три утверждения в соответствующих местах (в функции didMove, до изменения сцены ...), чтобы решить эту проблему, но, очевидно, ничего не помогло.

Заранее спасибо!

1 Ответ

0 голосов
/ 28 апреля 2018
time.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(GameScene_1.updateTimer)), userInfo: nil, repeats: true)

Это создает цикл сохранения. Контроллер вида сохраняет таймер (через time, я полагаю; не совсем понятно, что такое time), а таймер сохраняет контроллер вида (через target: self). Даже если это не так, таймер также сохраняется циклом выполнения, поэтому time.timer = nil не останавливает его.

Не ясно, что здесь означает time, поэтому я не совсем уверен, какой код вам нужен, но инструмент, который вам нужен - invalidate(). Вам нужно вызывать timer.invalidate() всякий раз, когда представление покидает экран (viewWillDisappear), и каждый раз, когда вы заменяете таймер. Я обычно использую что-то вроде:

var timer: Timer? {
    willSet {
        timer?.invalidate()
    }
}

Таким образом, каждый раз, когда вы назначаете timer, старый таймер становится недействительным (что почти всегда означает то, что вы имели в виду).

...