目的・役割
選択した日付のトレーニングセッションを表示・編集する画面。種目ごとにセットを追加し、PR検出・テンプレート適用・インターバルタイマー・シェアを操作できる。アプリの主機能画面。
UI 構成
| 要素 | 種類 | 説明 |
| 日付セレクタ | DatePicker | 編集対象の日付選択 |
| セッションリスト | List | その日の WorkoutSet(種目ごとグループ) |
| セット追加ボタン | Button | AddWorkoutView を sheet 表示 |
| テンプレート適用ボタン | Button | TemplateListView を sheet 表示 |
| インターバルタイマー | Button | IntervalTimerView を sheet 表示 |
| PR祝賀 | Overlay | PR検出時に演出 |
| シェアボタン | Toolbar | WorkoutShareSheet 起動 |
状態
| 状態 | 表示内容 |
| 記録なし | 「セットを追加して記録を始めましょう」 |
| 記録あり | 種目別グループのリスト |
| PR検出 | PR祝賀演出 + Paywall(POST-PR、v1.0.5) |
遷移
| 操作 | 遷移先 |
| セット追加 | AddWorkoutView (sheet) |
| セルタップ | EditWorkoutSetView (sheet) |
| テンプレート適用 | TemplateListView (sheet) |
| テンプレ保存 | SaveTemplateView (sheet) |
| インターバルタイマー | IntervalTimerView (sheet) |
| シェア | WorkoutShareSheet (sheet) |
| PR検出 → Paywall | PaywallView |
使用するデータモデル
@Model final class WorkoutSession {
var id: UUID
var date: Date
var note: String?
@Relationship(deleteRule: .cascade, inverse: \WorkoutSet.session)
var sets: [WorkoutSet] = []
}
@Model final class WorkoutSet {
var id: UUID
var exercise: Exercise?
var weight: Double
var reps: Int
var order: Int
var session: WorkoutSession?
var duration: Double // 有酸素分
var distance: Double // 有酸素km
}
実装メモ
- SwiftData @Query で対象日の WorkoutSession を取得
- PRDetector でセット保存時に過去最大値比較
- テンプレート適用時は経験・目標で重量・レップを自動補正
- scenePhase 監視でインターバルタイマー中断時処理
- 非同期保存中の入力ロック(v1.x)
関連
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成 |