永久禁用计时器-IOS Swift 4



我正在尝试在玩家未能实现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中 - 功能,在场景更改之前...(来编写以下三个陈述,以解决此问题,但显然没有任何帮助。

预先感谢您!

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()。每当视图离开屏幕(viewWillDisappear(时,您都需要调用timer.invalidate(),每当您更换计时器时。我通常使用以下内容:

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

以这种方式,每当您分配给timer时,旧的计时器都会无效(这几乎总是您的意思(。

最新更新