Swift开发问题:当前Workout无法显示历史锻炼属性及日期
看起来你在处理当前 Workout 展示历史锻炼数据的问题时碰到了麻烦——这种场景下的逻辑偏差确实容易让人头疼,我帮你梳理几个可能的排查方向和修复思路:
1. 检查lastWorkout()的核心逻辑
从你给出的代码片段来看,函数里同时判断了currentWorkout()是否存在,这很可能是问题的根源:当处于当前Workout页面时,currentWorkout()会返回一个非空值,但这个值是正在进行中的锻炼,不是你需要的历史完成锻炼。
建议调整函数逻辑,先获取用户的所有锻炼列表,再排除当前正在进行的那一项,最后按日期倒序取最新的完成锻炼:
func lastWorkout() -> Workout? { guard let client = currentClient(), let allWorkouts = client.workouts else { return nil } // 过滤掉当前正在进行的锻炼,只保留已完成的历史记录 let completedWorkouts = allWorkouts.filter { workout in workout != currentWorkout() && workout.status == .completed // 假设有status字段区分状态 } // 按日期从新到旧排序,取第一条 return completedWorkouts.sorted { $0.date > $1.date }.first }
如果你的Workout模型没有状态字段,可以用日期或者其他标识(比如是否有结束时间)来区分当前和历史锻炼。
2. 修复日期标签的显示逻辑
日期只显示今日,大概率是你在渲染标签时,错误地将默认值设为了当前日期,而没有正确判断lastWorkout()是否返回有效数据。比如:
// 错误示例:当lastWorkout()为nil时直接用今日日期 let displayDate = lastWorkout()?.date ?? Date()
你可以改成这样,确保只有当存在历史锻炼时才显示对应日期,否则可以显示“无历史锻炼”之类的提示:
if let lastWorkoutDate = lastWorkout()?.date { // 渲染历史锻炼日期 dateLabel.text = dateFormatter.string(from: lastWorkoutDate) } else { // 没有历史锻炼时的提示 dateLabel.text = "暂无历史锻炼记录" }
3. 确认页面的数据刷新时机
有时候问题出在数据没有及时刷新:比如你在页面初始化时只调用了一次lastWorkout(),但当用户完成历史锻炼后回到当前Workout页面,数据没有重新获取。
可以在页面的生命周期方法(比如UIKit的viewWillAppear,或者SwiftUI的.onAppear)里重新调用lastWorkout()并刷新UI,确保展示的是最新的历史数据。
4. 检查数据模型的一致性
最后确认你的Workout模型中,日期字段date是否正确存储了每一次锻炼的实际日期,而不是默认的当前日期。如果历史锻炼的日期被错误设置为今日,那自然会显示不对。
如果能补充以下代码片段,我可以帮你更精准地定位问题:
currentWorkout()函数的实现- Workout模型的定义(尤其是日期、状态相关字段)
- 当前Workout页面中渲染历史数据的UI代码
内容的提问来源于stack exchange,提问作者Matt Brown

