(使用 Xcode 12.3 和 iOS 14.3)
我使用DatePicker具有默认样式 ( DefaultDatePickerStyle)的组件来显示和编辑日期:该组件在标签中显示当前日期值,并在点击该标签时弹出日历。到现在为止还挺好。
当我更改日期时(以编程方式或在 UI 中手动更改),组件会不规律地更改其标签的日期格式。它似乎在 的.short和.medium值之间切换DateFormatter.Style。请注意,日期格式不能以编程方式设置,它是DatePicker.
下面是一个例子:
的DatePicker显示“2021年2月7日”; 我通过使用按钮减去一天来更改日期,导致组件显示“2/6/21”;再次减去一天,显示会更改为“2021 年 2 月 5 日”等。有时它会为几个日期保持相同的格式,但大多数情况下它会在每次更改时切换。
示例代码:
struct DateView: View {
@State var date = Date()
var body: some View {
VStack(spacing: 20) {
Button("-1 day") {
date.addTimeInterval(-24*60*60)
}
Button("+1 day") {
date.addTimeInterval(24*60*60)
}
DatePicker(
"Date",
selection: $date,
displayedComponents: .date
).labelsHidden()
}
}
}
Run Code Online (Sandbox Code Playgroud)
省略displayedComponents或labelsHidden对该问题没有影响。
重复打开日历弹出窗口并选择日期时也会出现同样的问题:关闭弹出窗口后,显示的日期有时是短格式,有时是中等格式。
知道那里发生了什么吗?
Asp*_*eri 12
看起来像一个错误。这是一个找到的解决方法(使用 Xcode 13beta / iOS 15 测试)
DatePicker(
"Date",
selection: $date,
displayedComponents: .date
)
.labelsHidden()
.id(date) // << here !!
Run Code Online (Sandbox Code Playgroud)
对我来说,建议的解决方法确实有效,但在以正确的方式格式化之前,日期仍然在很短的时间内显示短格式。另一个对我来说没有任何问题的方法是包装 aUIDatePicker以在 SwiftUI 中使用它,而不是使用视图中的构建(取自/sf/answers/4189729071/)。
struct MyDatePicker: UIViewRepresentable {
@Binding var date: Date
var range: ClosedRange<Date>
func makeUIView(context: Context) -> UIDatePicker {
let datePicker = UIDatePicker()
datePicker.datePickerMode = .date
datePicker.addTarget(context.coordinator, action: #selector(Coordinator.changed(_:)), for: .valueChanged)
datePicker.minimumDate = range.lowerBound
datePicker.maximumDate = range.upperBound
return datePicker
}
func updateUIView(_ datePicker: UIDatePicker, context: Context) {
datePicker.date = date
}
func makeCoordinator() -> MyDatePicker.Coordinator {
Coordinator(date: $date)
}
class Coordinator: NSObject {
private let date: Binding<Date>
init(date: Binding<Date>) {
self.date = date
}
@objc func changed(_ sender: UIDatePicker) {
self.date.wrappedValue = sender.date
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以像这样简单地调用它并根据您的需要自定义它:
HStack {
Text("Select date")
Spacer()
MyDatePicker(
date: $date,
range: range
).frame(maxHeight: 35)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |