[XCode 8, Swift 3] 使用observedProgress时如何重置UIProgressView为0
嘿,我刚好碰到过一模一样的问题!这其实是Progress对象的一个容易被忽略的特性导致的——一旦它的completedUnitCount达到(或超过)totalUnitCount,这个Progress就会被标记为已完成状态,而且这个状态一旦触发,就不会自动恢复,哪怕你之后把两个计数都改回0。
为什么会这样?
Progress内部有个只读的isFinished属性,当completedUnitCount >= totalUnitCount时,它会被自动设为true。而UIProgressView在观察Progress对象时,不仅会监听fractionCompleted的变化,还会关注isFinished状态。一旦检测到isFinished = true,它就会固定显示100%,哪怕你后续修改了计数让fractionCompleted回到0.0,它也不会再更新了——这就是你遇到的问题根源。
两种解决方法
1. 推荐:创建新的Progress实例(最优雅)
Progress的设计初衷就是跟踪单次任务的进度,完成后直接替换成新实例才是符合设计意图的做法,完全不需要破坏观察模式的优雅性:
// 重置时创建新的Progress对象 myProgress = Progress(totalUnitCount: 0) progressView.observedProgress = myProgress
新的实例初始状态就是未完成的,后续更新totalUnitCount和completedUnitCount时,UIProgressView会正常响应所有变化。
2. 复用现有实例(不推荐)
如果你一定要复用原来的Progress对象,可以通过KVC强制把isFinished改回false,但这种方法依赖未公开的API键,存在后续版本失效的风险:
myProgress.totalUnitCount = 0 myProgress.completedUnitCount = 0 // 注意:这个键是未公开的,可能在未来iOS版本中被修改 myProgress.setValue(false, forKey: "isFinished")
总结
与其纠结怎么重置已完成的Progress,不如直接新建实例——这既符合Progress的设计逻辑,也能避免潜在的兼容性问题,还能保持你想要的“通过观察对象控制视图”的优雅性。
内容的提问来源于stack exchange,提问作者biomiker

