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
相关产品推荐
相关产品推荐

