如何限制 SwiftUI DatePicker 的选择值?

How do I limit the selection values of a SwiftUI DatePicker?

有人知道如何添加这样的功能 - 如果所选年龄 < 18 - 用户无法点击继续按钮并且不会导航到下一页吗?会对我有很大帮助。

我的代码:

import SwiftUI

struct DateOfBirthView: View {
    
@ State private var birthdate = Date()
    
    var body: some View {
        VStack {
            DatePicker("date of birth", selection: $birthdate,
                       displayedComponents: [.date])
                .font(.title3)
                .padding()
                .background(RoundedRectangle(cornerRadius: 10).fill(Color.gray.opacity(0.1)))
                .padding(.top, 15)
            
            Text("you must be at least 18 to Register")
                .frame(maxWidth: .infinity, alignment: .leading)
                .padding(.leading)
            
            CustomNavLink(destination: SelectGenderView()
                .customNavigationTitle("Registration"),
                label: {
            DefaultButton (title: "continue")
                .padding(.top, 15)
            })
            
            Spacer()
            
        }
        .padding (.horizontal, 25)
    }
}

您可以将所选日期与代表第一个有效日期的日期进行比较。

我不知道 CustomNavLinkDefaultButton 的组成,你没有包括,所以我用 Buttondisabled 来展示演示概念:

struct DateOfBirthView: View {
    
    @State private var birthdate = Date()
    
    var dateIsValid : Bool {
        let currentDate = Date()
        var dateComponent = DateComponents()
        dateComponent.year = -18
        guard let validDate = Calendar.current.date(byAdding: dateComponent, to: currentDate) else {
            return false
        }
        return birthdate <= validDate
    }
    
    var body: some View {
        VStack {
            DatePicker("date of birth", selection: $birthdate,
                       displayedComponents: [.date])
                .font(.title3)
                .padding()
                .background(RoundedRectangle(cornerRadius: 10).fill(Color.gray.opacity(0.1)))
                .padding(.top, 15)
            
            Text("you must be at least 18 to Register")
                .frame(maxWidth: .infinity, alignment: .leading)
                .padding(.leading)
            
            Button("Continue") {
                
            }.disabled(!dateIsValid)
            
            Spacer()
            
        }
        .padding (.horizontal, 25)
    }
}

您还可以明确限制日期选择器的选择范围。 Apple's documentation 提供了以下示例:

@State private var date = Date()
let dateRange: ClosedRange<Date> = {
    let calendar = Calendar.current
    let startComponents = DateComponents(year: 2021, month: 1, day: 1)
    let endComponents = DateComponents(year: 2021, month: 12, day: 31, hour: 23, minute: 59, second: 59)
    return calendar.date(from:startComponents)!
        ...
        calendar.date(from:endComponents)!
}()

var body: some View {
    DatePicker(
        "Start Date",
         selection: $date,
         in: dateRange,
         displayedComponents: [.date, .hourAndMinute]
    )
}