我正在嘗試在今天和明天之間選擇一個 DatePicker。兩個按鈕切換日期范圍。
如何使今天的范圍?即現在 -> 一天結束
如何制作明天的范圍?即第二天開始 -> 第二天結束
以及如何使 DatePicker 回應此更改?
我應該選擇什么選擇來將它系結到 DatePicker(我的意思是哪個日期),取決于 Range?
我已經做了什么:
VStack {
HStack {
Spacer()
Button("Today") {
//switch to today range
}
Spacer()
Button("Tomorrow") {
//switch to tommorow range
}
Spacer()
}
DatePicker("Delivery Time", selection: $date, in: tommorowRange, displayedComponents: .hourAndMinute)
.labelsHidden()
.datePickerStyle(.wheel)
.frame(width: 200, height: 150)
.clipped()
.padding()
}
日期范圍:(不正確)
var todayRange: ClosedRange<Date> {
let calendar = Calendar.current
var endComponents = DateComponents()
endComponents.day = 1
let endDate = calendar.date(byAdding: endComponents, to: Date.now)!
return Date.now ... endDate
}
var tommorowRange: ClosedRange<Date> {
let calendar = Calendar.current
var startComponents = DateComponents()
startComponents.day = 2
var endComponents = DateComponents()
endComponents.day = 1
let startDate = calendar.date(byAdding: startComponents, to: Date.now)!
let endDate = calendar.date(byAdding: endComponents, to: startDate)!
return startDate ... endDate
}
它應該看起來如何:

uj5u.com熱心網友回復:
您可以使用 a DatePickerwithdisplayedComponents: .hourAndMinute并使Todayand Tomorrow Buttons 僅更改與 a 相關的日期組件date。
struct CustomDatePicker: View {
@State var date: Date = .now
@State var showPicker: Bool = false
var body: some View {
Button {
showPicker.toggle()
} label: {
Text(date, format:.dateTime)
}
.sheet(isPresented: $showPicker) {
VStack{
HStack{
Spacer()
//Today Button
Button {
//Components for date for today
var todayComponents = Calendar.current.dateComponents([.year,.month,.day,.calendar], from: Date())
//Components for time from the `date` that is affected by the picker
let pickTime = Calendar.current.dateComponents([.hour, .minute,.timeZone], from: date)
//Combine the components
todayComponents.hour = pickTime.hour
todayComponents.minute = pickTime.minute
todayComponents.timeZone = pickTime.timeZone
//Set the new date
date = Calendar.current.date(from: todayComponents)!
} label: {
Text("Today")
//Change color depending on date
.foregroundColor(Calendar.current.isDateInToday(date) ? Color.accentColor : Color.gray)
}
Spacer()
//Tomorrow Button
Button {
//Tomorrow's date
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: .now)!
//Components for the date
var tomorrowComp = Calendar.current.dateComponents([.year,.month,.day,.calendar], from: tomorrow)
//Components for the time
let pickTime = Calendar.current.dateComponents([.hour, .minute,.timeZone], from: date)
//Combine
tomorrowComp.hour = pickTime.hour
tomorrowComp.minute = pickTime.minute
tomorrowComp.timeZone = pickTime.timeZone
//Set the new date
date = Calendar.current.date(from: tomorrowComp)!
} label: {
Text("Tomorrow")
}
//Change color depending on date
.foregroundColor(Calendar.current.isDateInTomorrow(date) ? Color.accentColor : Color.gray)
Spacer()
}
DatePicker("date", selection: $date, displayedComponents: .hourAndMinute).datePickerStyle(.wheel)
}.presentationDetents([.medium])
}
}
}
uj5u.com熱心網友回復:
您可以簡單地添加另一個DatePicker并通過切換在它們之間切換:
struct ContentView: View {
@State var todayDate: Date = .now
@State var tomorrowDate: Date = Calendar.current.startOfDay(for: Calendar.current.date(byAdding: .day, value: 1, to: .now)!)
var todayRange: ClosedRange<Date> {
let calendar = Calendar.current
var endComponents = DateComponents()
endComponents.day = 1
let endDate = calendar.date(byAdding: endComponents, to: Date.now)!
return Date.now ... endDate
}
var tomorrowRange: ClosedRange<Date> {
let calendar = Calendar.current
var startComponents = DateComponents()
startComponents.day = 2
var endComponents = DateComponents()
endComponents.day = 1
let correctStartDate = calendar.date(bySettingHour: 0, minute: 0, second: 0, of: .now)!
let startDate = calendar.date(byAdding: .day, value: 1, to: correctStartDate)!
let endDate = calendar.date(byAdding: .day, value: 2, to: correctStartDate)!
return startDate ... endDate
}
@State var isTodayRange = true
var body: some View {
VStack {
HStack {
Spacer()
Button("Today") {
withAnimation {
isTodayRange = true
}
}
.background(isTodayRange ? .red : .white)
Spacer()
Button("Tomorrow") {
withAnimation {
isTodayRange = false
}
}
.background(isTodayRange ? .white : .red)
Spacer()
}
if isTodayRange {
picker($todayDate, range: todayRange)
} else {
picker($tomorrowDate, range: tomorrowRange)
}
}
}
func picker(_ selection: Binding<Date>, range: ClosedRange<Date>) -> some View {
DatePicker("Delivery Time", selection: selection, in: range, displayedComponents: .hourAndMinute)
.labelsHidden()
.datePickerStyle(.wheel)
.frame(width: 200, height: 150)
.clipped()
.padding()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513092.html
標籤:日期迅捷日期选择器
