Swiftui DatePicker events

1.6k Views Asked by At

I have a DatePicker such as:

DatePicker("DATE & TIME", selection: Binding(get: {
    self.dateTime
 }, set: { newValue in
    self.dateTime = newValue
    if newValue > Date() {
         sendDateTimeToServer()
    }
}), displayedComponents: [.date, .hourAndMinute])

enter image description here

enter image description here

As opposed to calling sendDateTimeToServer() every time dateTime changes I want to wait until the fullscreen (2nd image) DatePicker has collapsed, is there an event? Open to other suggestions too!

Thanks,

1

There are 1 best solutions below

7
On

Update Property observers didSet gives a chance do some work when the popover is dismissed. Try this:

struct UpdateOnDismissView: View {
    @EnvironmentObject var context : LaunchContext
    
    var body: some View {
        VStack {
            Text("\(context.launch)").padding()
            Button("Set Launch Date", action: { context.show.toggle() })
                .padding()
                .popover(isPresented: $context.show, content: { panel })
        }
    }
    
    var panel : some View {
        VStack {
            Button("Done", action: { context.show.toggle() })
            DatePicker("Launch", selection: Binding(get: {
                context.launch
            }, set: { newValue in
                context.launch = newValue
            }), displayedComponents: [.date, .hourAndMinute])
        }
        .padding()
        .onDisappear(perform: {
            print("Popover disappearing")
        })
    }
}

struct UpdateOnDismissView_Previews: PreviewProvider {
    static var previews: some View {
        UpdateOnDismissView().environmentObject(LaunchContext())
    }
}

class LaunchContext : ObservableObject {
    @Published var launch : Date = Date()
    @Published var show : Bool = false { didSet {
        if !show && launch < Date() {
            sendLaunchToServer()
        } else {
            print("Dismissed")
        }
    }}
    
    func sendLaunchToServer() {
        print("Sending date \(launch)")
    }
}

When should you use property observers?