SwiftUI DatePicker 在更改日期时在短日期格式和中日期格式之间跳转

Posted

技术标签:

【中文标题】SwiftUI DatePicker 在更改日期时在短日期格式和中日期格式之间跳转【英文标题】:SwiftUI DatePicker jumps between short and medium date formats when changing the date 【发布时间】:2021-02-07 16:27:14 【问题描述】:

(使用 Xcode 12.3 和 ios 14.3)

我使用具有默认样式 (DefaultDatePickerStyle) 的 DatePicker 组件来显示和编辑日期:该组件在标签中显示当前日期值,并在点击该标签时弹出一个日历。到目前为止,一切顺利。

当我更改日期(以编程方式或在 UI 中手动更改)时,组件会不规律地更改其标签的日期格式。它似乎在DateFormatter.Style.short.medium 值之间切换。请注意,不能以编程方式设置日期格式,它是 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()
    
  

省略displayedComponentslabelsHidden 对问题没有影响。

重复打开日历弹出窗口并选择日期时会出现同样的问题:关闭弹出窗口后,显示的日期有时为短格式,有时为中格式。

知道那里发生了什么吗?

【问题讨论】:

我会向 Apple 提交反馈。看起来像一个错误。 @nicksarno 是的,已经这样做了,谢谢 你找到解决办法了吗? @NorNewman 不幸的是没有。我的解决方法是使用自定义DateFormatterText 中手动显示日期,当用户点击文本时,我会使用WheelDatePickerStyle 切换DatePicker 的显示。即使我希望使用新的选择器 UI,这也能可靠地工作。 @dsynkd 这是链接:feedbackassistant.apple.com/feedback/8995970;到目前为止,Apple 只要求我在 Xcode 13 Beta 中对此进行测试,但问题仍然存在。 【参考方案1】:

看起来像一个错误。这是一个找到的解决方法(使用 Xcode 13beta / iOS 15 测试)

  DatePicker(
    "Date",
    selection: $date,
    displayedComponents: .date
  )
  .labelsHidden()
  .id(date)             // << here !!

【讨论】:

您正在强制它在日期发生任何变化时重建 @MojtabaHosseini 当然,但这没什么大不了的,DatePicker 真的很容易重建 @MojtabaHosseini,当然——这是出于目的 一个非常愚蠢的错误的绝妙解决方案。它已经存在了一段时间,很高兴我找到了这个解决方法。 我还有一个问题,每次我选择日期或月份或年份时,选择器都会自动关闭.. 还有其他人面临同样的问题吗?

以上是关于SwiftUI DatePicker 在更改日期时在短日期格式和中日期格式之间跳转的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中更改 DatePicker 字体粗细

SwiftUI Mac OS DatePicker 在编辑时跳回到今天

如何使用 SwiftUI 和 Combine 检测 Datepicker 的值变化?

如何以编程方式更改 swiftUI DatePicker 的选定值

在 SwiftUI 中创建具有特定日期的 DatePicker

如何更改GraphicalDatePickerStyle日期选择器Swiftui的选择颜色(AM,PM)和时间