是否可以使用绑定设置 SwiftUI DatePicker 的minimumDate?

问题描述 投票:0回答:2

我正在尝试使用 @Binding 和 @State 设置 SwiftUI 中日期选择器的最小日期值。

我有三个踏步机,一个可以持续几天,一个可以持续几个小时,一个可以持续几分钟。这些用于设置 DateComponents 的值。

我想看到的是,当我使用步进器时,DatePicker 会调整为最小日期和时间。这可能吗?

我编辑了这篇文章并删除了所有代码示例,因为它们与解决方案无关。这些问题是由已弃用的 DatePicker 初始化程序代码引起的。请参阅下面的答案。

swiftui
2个回答
34
投票

这是解决方案。 SwiftUI DatePickers 中已弃用最小和最大日期。更改和解决方案发布在这里:https://sarunw.com/posts/swiftui-changes-in-xcode-11-beta-4

如果链接不起作用,请参阅以下示例。

DatePicker 已弃用初始值设定项 带有minimumDate 和maximumDate 的初始化器消失了。现在我们用 ClosedRange、PartialRangeThrough 和 PartialRangeFrom 初始化它。

我们使用 PartialRangeFrom 作为最小日期。

DatePicker("Minimum Date",
    selection: $selectedDate,
    in: Date()...,
    displayedComponents: [.date])

我们使用 PartialRangeThrough 作为最大日期。

DatePicker("Maximum Date",
    selection: $selectedDate,
    in: ...Date(),
    displayedComponents: [.date])

如果你想强制执行minimumDate和maximumDate,请使用ClosedRange

@State var selectedDate = Date()

var dateClosedRange: ClosedRange<Date> {
    let min = Calendar.current.date(byAdding: .day, value: -1, to: Date())!
    let max = Calendar.current.date(byAdding: .day, value: 1, to: Date())!
    return min...max
}

DatePicker(
    selection: $selectedDate,
    in: dateClosedRange,
    displayedComponents: [.hourAndMinute, .date],
    label: { Text("Due Date") }
)

在所有示例中,Date() 都可以替换为 Date 类型的绑定。


0
投票

用于禁用未来日期

DatePicker("Select a Date",
                   selection: $selectedDate,
                   in: Date.distantPast...maxDate,
                   displayedComponents: [.date])

DatePicker("Select a Date",
                   selection: $selectedDate,
                   in: ...maxDate,
                   displayedComponents: [.date])
        
        

以及禁用过去的日期

DatePicker("Select a Date",
                   selection: $selectedDate,
                   in: minDate...Date.distantFuture,
                   displayedComponents: [.date])

DatePicker("Select a Date",
                       selection: $selectedDate,
                       in: minDate...,
                       displayedComponents: [.date])
© www.soinside.com 2019 - 2024. All rights reserved.