Search code examples
swiftdatetimeswiftui

How to make it so a DatePickers Date cannot start before another DatePickers Date in SwiftUI


I have two pickers for workoutStartTime and workoutEndTime that default to Date.now but currently the user can set the end time earlier than the start time. How do you prevent this?

@State private var workoutName: String = ""
@State private var workoutStartTime: Date = Date.now
@State private var workoutEndTime: Date = Date.now
    
@State private var showExercieSheet = false
    
var body: some View {
    VStack {
        List {
            Section(header: Text("Workout Details")) {
                
                TextField("Enter workout name",text: $workoutName)
                DatePicker("Start Time", selection: $workoutStartTime)
                DatePicker("End Time", selection: $workoutEndTime)                            
            }
        }
    }
}

Solution

  • Test the change of one date to adjust the second time if no more valid.

    VStack {
        ...
        }
        .onChange(of: workoutStartTime) {
            // if new start time if after end time then adjust end time
            if workoutStartTime > workoutEndTime { 
                workoutEndTime = workoutStartTime
            }
        }
        .onChange(of: workoutEndTime) {
            // if new end time is before start time then adjust start time
            if workoutEndTime < workoutStartTime  {
                workoutStartTime = workoutEndTime
            }
        }