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

SwiftUI中如何通过可选Workout数据区分新建与编辑视图

实现SwiftData下新建/编辑训练视图的复用

你可以通过给AddWorkoutView添加可选的Workout参数,区分新建和编辑场景,具体实现步骤如下:

1. 修改视图初始化逻辑

把原来硬编码创建临时Workout的逻辑,改成通过初始化参数传入,无传入时再创建临时对象:

struct AddWorkoutView: View {
    @Environment(\.modelContext) var modelContext
    @State private var showExercieSheet = false
    
    // 用@State包装对象,确保UI修改能响应
    @State private var workout: Workout
    
    // 支持可选传入Workout,不传则新建临时对象
    init(workout: Workout? = nil) {
        if let existingWorkout = workout {
            // 编辑模式:复用传入的现有Workout
            _workout = State(initialValue: existingWorkout)
        } else {
            // 新建模式:创建临时Workout
            _workout = State(initialValue: Workout(id: UUID()))
        }
    }
    
    // 剩余视图代码...
}

2. 绑定UI到Workout属性

删掉原来单独的workoutName、workoutStartTime等@State变量,直接绑定到workout的对应属性,修改会直接作用在目标对象上:

var body: some View {
    Form {
        TextField("训练名称", text: $workout.name)
        
        DatePicker("开始时间", selection: $workout.startTime, displayedComponents: .dateAndTime)
        
        DatePicker("结束时间", selection: $workout.endTime, displayedComponents: .dateAndTime)
        
        Button("保存") {
            saveWorkout()
        }
    }
}

3. 区分场景的保存逻辑

SwiftData会自动跟踪已存在于上下文的对象,编辑时无需额外操作;新建时需要将临时对象插入上下文:

private func saveWorkout() {
    // 判断是否为新建对象:检查是否在上下文的插入队列中
    if modelContext.inserted.contains(workout) {
        modelContext.insert(workout)
    }
    // 编辑模式下,SwiftData会自动持久化属性修改
    
    // 这里可以添加返回逻辑
    dismiss()
}

4. 保持原有导航逻辑不变

你之前的两种导航方式无需修改,因为初始化方法支持可选参数:

  • 新建训练:AddWorkoutView()
  • 编辑训练:AddWorkoutView(workout: workout)

这样就能在同一个视图里复用新建和编辑逻辑,编辑时直接修改传入的SwiftData对象,新建时创建临时对象再插入上下文。

内容的提问来源于stack exchange,提问作者Milan Labus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:06:02