Swiftui DatePicker 事件

问题描述

我有一个 DatePicker,例如:

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

与每次 dateTime 更改时调用 sendDateTimetoServer() 相反,我想等到全屏(第二张图像)DatePicker 折叠,是否有事件?也欢迎其他建议!

谢谢,

解决方法

更新 属性观察者 didSet 提供了在弹出窗口被解除时做一些工作的机会。试试这个:

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?