永久禁用计时器 - iOS Swift 4

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了永久禁用计时器 - 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()。只要视图离开屏幕(timer.invalidate()),您就需要在更换计时器时调用viewWillDisappear。我通常使用类似的东西:

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

这样,无论何时分配给timer,旧计时器都将失效(这几乎总是你的意思)。

以上是关于永久禁用计时器 - iOS Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

如何使用倒数计时器停止游戏 - iOS [SWIFT] -

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

启用/禁用表格视图单元格 - iOS - Swift

如何将这个 Objective-C 代码片段写入 Swift?

无法在 iOS 15 swift 上禁用键盘上的自动填充。 Xcode 13

Vapor 3 Swift 4 如何制作计时器