永久禁用计时器 - 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?
如何将这个 Objective-C 代码片段写入 Swift?