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

Swift开发问题:当前Workout无法显示历史锻炼属性及日期

排查当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:03:23