永久禁用计时器 - iOS Swift 4

问题描述 投票:0回答:1

在玩家未能在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 - 函数中,在场景改变之前)写下以下三个语句来解决这个问题,但显然没有任何帮助。

先感谢您!

ios timer swift4
1个回答
0
投票
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,旧计时器都将失效(这几乎总是你的意思)。

© www.soinside.com 2019 - 2024. All rights reserved.