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

Swift跨类访问PoseEstimator的squatCount变量始终返回0如何解决

问题成因
  • 实例不共享:90%以上的新手遇到该问题都是这个原因:你在深蹲计数的业务逻辑中使用了一个PoseEstimator实例完成累加操作,但是在DoneViewController中又重新初始化了一个全新的PoseEstimator对象,不同类实例的存储属性相互独立,新实例的squatCount默认是初始值0,因此标签始终显示0。
  • UI刷新线程错误:如果确认使用的是同一个实例,需要检查squatCount更新和标签赋值的操作是否在子线程执行,所有UI更新操作必须在主线程触发,否则会出现更新不生效、延迟显示等问题。
  • 未主动触发赋值:你没有对squatCount的值变化做监听,值累加完成后没有主动给UILabel的text属性重新赋值,导致标签始终显示首次加载时的初始值。
可行解决方法

方法1:属性传值(最简单,适合单次页面跳转场景)

如果你的业务逻辑是计数完成后直接跳转到DoneViewController,直接在跳转时把已经累加完成的squatCount值传给目标控制器即可,不需要修改PoseEstimator的原有结构:

// 计数页跳转时的代码
let doneVC = DoneViewController()
// 把当前使用的PoseEstimator实例的squatCount值直接传给下一页
doneVC.receiveSquatCount = yourPoseEstimatorInstance.squatCount
// 跳转逻辑(push/modal都适用)
navigationController?.pushViewController(doneVC, animated: true)

DoneViewController内的代码:

class DoneViewController: UIViewController {
    // 对外暴露的接收属性,用于承接上一页传过来的值
    var receiveSquatCount: Int = 0
    @IBOutlet weak var squatCountLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 直接给标签赋值即可
        squatCountLabel.text = "\(receiveSquatCount)"
    }
}

方法2:单例改造(适合多页面共享计数数据场景)

如果你的App中多个页面都需要访问PoseEstimator的计数数据,可以把PoseEstimator改造成单例类,全局共用同一个实例,避免重复初始化的问题:
首先改造PoseEstimator代码:

class PoseEstimator {
    // 全局唯一的共享实例
    static let shared = PoseEstimator()
    // 私有化初始化方法,禁止外部手动创建新的实例
    private init() {}

    var squatCount: Int = 0
    // 你原有PoseEstimator的其他逻辑保持不变
}

后续所有用到PoseEstimator的地方都不要手动调用PoseEstimator()创建新实例,统一使用共享实例:

// 计数累加时的代码
PoseEstimator.shared.squatCount += 1

// DoneViewController取值时的代码
override func viewDidLoad() {
    super.viewDidLoad()
    // 确保在主线程刷新UI
    DispatchQueue.main.async {
        self.squatCountLabel.text = "\(PoseEstimator.shared.squatCount)"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:06:00