如何限制 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)
}
}
您可以将所选日期与代表第一个有效日期的日期进行比较。
我不知道 CustomNavLink
或 DefaultButton
的组成,你没有包括,所以我用 Button
和 disabled
来展示演示概念:
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]
)
}
有人知道如何添加这样的功能 - 如果所选年龄 < 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)
}
}
您可以将所选日期与代表第一个有效日期的日期进行比较。
我不知道 CustomNavLink
或 DefaultButton
的组成,你没有包括,所以我用 Button
和 disabled
来展示演示概念:
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]
)
}