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
相关产品推荐
相关产品推荐

