You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift游戏场景设置倒计时计时器并显示时崩溃问题求助

解决Swift GameScene倒计时崩溃问题

嘿,你大概率是踩了SpriteKit场景和UIViewController生命周期混淆的坑啦!GameScene作为SKScene的子类,根本没有viewDidLoad这个方法,你在这个不存在的方法里调用startTimer,自然会导致崩溃或者逻辑完全不执行的问题。下面给你一套完整的正确实现方案:

1. 定义计时器相关属性

首先在GameScene类里声明需要的变量:

class GameScene: SKScene {
    // 剩余倒计时秒数
    private var remainingTime: Int = 60
    // 计时器实例,用来控制每秒触发更新
    private var countdownTimer: Timer?
    // 显示剩余时间的标签
    private let timeDisplayLabel = SKLabelNode(text: "60")
}

2. 用正确的生命周期方法初始化

SKScene加载完成后会调用didMove(to view: SKView),这才是你应该用来初始化计时器和UI元素的地方,对应UIViewController的viewDidLoad:

override func didMove(to view: SKView) {
    // 配置时间标签的样式和位置
    timeDisplayLabel.fontSize = 42
    timeDisplayLabel.fontColor = .white
    timeDisplayLabel.position = CGPoint(x: frame.midX, y: frame.maxY - 60)
    timeDisplayLabel.fontName = "Arial-BoldMT"
    addChild(timeDisplayLabel)
    
    // 启动倒计时
    startCountdownTimer()
}

3. 实现计时器的启动和更新逻辑

private func startCountdownTimer() {
    // 每秒触发一次updateCountdown方法
    countdownTimer = Timer.scheduledTimer(
        timeInterval: 1.0,
        target: self,
        selector: #selector(updateCountdown),
        userInfo: nil,
        repeats: true
    )
}

@objc private func updateCountdown() {
    remainingTime -= 1
    timeDisplayLabel.text = "\(remainingTime)"
    
    // 时间归零时停止计时器并执行收尾逻辑
    if remainingTime <= 0 {
        countdownTimer?.invalidate()
        countdownTimer = nil
        print("倒计时结束!游戏结束逻辑可以在这里添加")
        // 比如弹出游戏结束提示、切换场景等
    }
}

4. 清理计时器避免内存泄漏

当场景被移除时,记得销毁计时器,防止内存泄漏:

override func willMove(from view: SKView) {
    countdownTimer?.invalidate()
    countdownTimer = nil
}

额外注意点

  • 如果你之前的崩溃信息提示“unrecognized selector sent to instance”,那大概率是因为updateTimer方法没有加@objc标记,Swift的Timer selector需要暴露给OC运行时,必须加这个标记
  • 确保你的计时器对象被正确持有(用实例变量而不是局部变量),不然计时器会被提前释放,导致倒计时中途停止

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:31:04