【问题标题】:Swiftui DatePicker eventsSwiftui DatePicker 事件
【发布时间】:2021-02-13 21:54:18
【问题描述】:

我有一个 DatePicker,例如:

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

与每次 dateTime 更改时调用 sendDateTimeToServer() 不同,我想等到全屏(第二张图像)DatePicker 崩溃,有事件吗?也欢迎其他建议!

谢谢,

【问题讨论】:

    标签: swift swiftui swiftui-datepicker


    【解决方案1】:

    更新 属性观察者 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?

    【讨论】:

    • 谢谢,.onDisappear 没有被调用。
    • 您能分享更多关于日期选择器的生命周期的信息吗?也许发布整个结构或至少是正文?
    • 似乎只有当整个 DatePicker 从视图层次结构中删除时才会调用 onDisappear - 而不仅仅是 OP 引用的弹出窗口。 FWIW,我对此进行了调查,但找不到好的解决方案。
    • 已更新代码示例以包含整个视图。希望扩展的示例有用。
    • 感谢 Helperbug,正如 jnpdx 所说,我正在寻找与弹出窗口相关的事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多