当用户点击已选择的日期时关闭 SwiftUI DatePicker

joe*_*ern 7 datepicker ios swiftui

我希望用户通过呈现 SwiftUI DatePicker来选择过去的日期。日期绑定设置为今天的日期。

现在,我希望用户能够选择今天的日期。但是,当用户点击已选择的日期时,DatePicker 不会消失。仅当用户点击尚未选择的日期时,它才会被关闭。因此,就我而言,我想在用户点击 13 时关闭 DatePicker。

日期选择器

当用户点击预先选择的日期时,有没有办法关闭 DatePicker?

以下是我使用 DatePicker 的方法:

struct DatePickerView: View {
    @Binding var date: Date

    var body: some View {
        DatePicker(
            "Select Date",
            selection: $date,
            in: ...Date(),
            displayedComponents: [.date]
        )
        .datePickerStyle(.graphical)
        .background(Color.white)
        .cornerRadius(8)
        .padding(.horizontal, 40)
    }
}
Run Code Online (Sandbox Code Playgroud)

mal*_*hal 3

我有一个类似的问题,并把一个.graphical DatePicker放在我自己的popover。唯一的缺点是 iPhone 弹出窗口目前显示为表格,这是一个恼人的不一致之处。现在,您可以按照自己喜欢的方式控制弹出窗口演示,甚至可以进行取消/完成操作。

struct DatePickerPopover: View {
    @State var showingPicker = false
    @State var oldDate = Date()
    @Binding var date: Date
    let doneAction: () -> ()
    
    var body: some View {
        Text(date, format:.dateTime.year())
        .foregroundColor(.accentColor)
        .onTapGesture {
            showingPicker.toggle()
        }
        .popover(isPresented: $showingPicker, attachmentAnchor: .point(.center)) {
            NavigationStack {
                DatePicker(selection: $date
                           , displayedComponents: [.date]){
                    
                }
               .datePickerStyle(.graphical)
               .toolbar {
                   ToolbarItem(placement: .cancellationAction) {
                       Button("Cancel") {
                           date = oldDate
                           showingPicker = false
                       }
                   }
                   ToolbarItem(placement: .confirmationAction) {
                       Button("Done") {
                           doneAction()
                           showingPicker = false
                       }
                   }
               }
            }
            
            
        }
        .onAppear {
            oldDate = date
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的回答,我真的很感激!您的建议有效,但就我而言,我不能不使用它,因为它会改变 UI 的外观,不幸的是我的客户不会接受该设计更改。我将保留这个问题,因为尽管你的建议很好,但它并不能解决我的问题。我希望你没问题。 (2认同)