我正在尝试设置一个从60秒到0的计时器,并在我的游戏场景中显示计数。但是,当我执行以下操作时,我一直遇到问题: 在我的GameScene.swift文件中,我创建了以下内容:
var gameTimer = 60
var timer = Timer()
@IBOutlet var timerLabel: UILabel!
在GameScene类下,然后在ViewDidLoad下我做了:
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameViewController.startTimer), userInfo: nil, repeats: true)
其中startTimer是一个具有以下内容的函数:
@objc func startTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameViewController.updateTimer), userInfo: nil, repeats: true)
}
和updateTimer是另一个更新计时器的函数:
@objc func updateTimer(){
gameTimer -= 1
timerLabel.text = String(gameTimer)
}
但是当我启动游戏时,游戏一直在崩溃。我在这做错了什么?任何帮助表示赞赏。
对于那些询问错误消息的人: 线程1:致命错误:在解包可选值时意外发现nil
它指向这行代码:
timerLabel.text = String(gameTimer)
答案 0 :(得分:1)
如果行timerLabel.text = String(gameTimer)
导致此崩溃,则意味着timerLabel
变量在该点保持为零。确保您的@IBOutlet
与故事板中的标签相关联。
此外,与您现在的问题无关,而不是
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameViewController.startTimer), userInfo: nil, repeats: true)
致电
startTimer()
直接在viewDidLoad
中。
在startTimer()
中创建的计时器负责每秒更新一次,你不应该一次又一次地启动它
答案 1 :(得分:0)
1-像这样宣布计时器
var timer:Timer ?
2-在viewDidLoad
中必须是1个计时器 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(GameViewController.startTimer), userInfo: nil, repeats: true)
使用该方法
@objc func updateTimer(){
gameTimer -= 1
timerLabel.text = String(gameTimer)
}
同时选中timerLabel
与stoyboard的连接作为
@IBOutlet var timerLabel: UILabel!
如果标签没有挂在故事板中的标签上,那么显式取消导致!
会导致崩溃