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

Swift中倒计时计时器结束后重启按钮不显示问题解决

问题原因及解决办法

核心问题

你的重启按钮无法显示主要有两个原因:

  • 按钮和进度条的Y轴位置重叠(都设为100),被进度条完全遮挡
  • 按钮未设置文字颜色或背景色,即便不重叠,在白色背景下默认白色文字也会和背景融合,无法看见

另外,计时器结束的判断逻辑存在浮点精度隐患,可能导致timeElapsed >= duration的条件偶尔不触发。

具体修复步骤

  1. 调整按钮位置:把按钮的Y坐标改得比进度条低,比如设为150,避免重叠
  2. 设置按钮样式:给按钮添加背景色或文字颜色,确保可见
  3. 优化计时器结束判断:用进度值是否达到1.0来判断,避免浮点累加的精度问题

修改后的完整代码

class TimerViewController: UIViewController {
    let duration: Double = 5 // duration in seconds
    var timer: Timer?
    var progressView: UIProgressView!
    var timeElapsed: Double = 0
    // 将按钮设为成员变量,提前创建避免重复实例化,也方便控制显示隐藏
    var restartButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white // 明确背景色,避免样式混乱

        // 创建进度条
        progressView = UIProgressView(progressViewStyle: .default)
        progressView.frame = CGRect(x: 20, y: 100, width: view.frame.width - 40, height: 10)
        progressView.progress = 0
        view.addSubview(progressView)

        // 提前创建重启按钮,初始隐藏
        restartButton = UIButton(type: .system)
        restartButton.frame = CGRect(x: view.frame.width/2 - 50, y: 150, width: 100, height: 50)
        restartButton.setTitle("Restart", for: .normal)
        restartButton.addTarget(self, action: #selector(restartTimer), for: .touchUpInside)
        restartButton.isHidden = true
        view.addSubview(restartButton)

        // 启动计时器
        startTimer()
    }

    func startTimer() {
        timer?.invalidate() // 先销毁已有计时器,避免重复
        timeElapsed = 0
        progressView.progress = 0
        restartButton.isHidden = true
        timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)
    }

    @objc func timerFired() {
        timeElapsed += 0.01
        let progress = Float(timeElapsed / duration)
        progressView.progress = progress
        
        // 用进度值判断结束,规避浮点精度问题
        if progress >= 1.0 {
            timer?.invalidate()
            timerEnded()
        }
    }

    func timerEnded() {
        print("Ended")
        restartButton.isHidden = false // 显示重启按钮
    }

    @objc func restartTimer() {
        startTimer() // 复用启动逻辑,减少代码冗余
    }
}

额外优化点

  • 将重启按钮设为成员变量,提前创建并隐藏,计时器结束时再显示,避免重复创建视图
  • 封装startTimer()方法,统一处理计时器启动逻辑,减少代码重复
  • 设置视图背景色为白色,确保界面样式统一

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:50:26