SwiftUI DatePicker 并不总是更新 State<Date> 变量

Posted

技术标签:

【中文标题】SwiftUI DatePicker 并不总是更新 State<Date> 变量【英文标题】:SwiftUI DatePicker does not always update State<Date> variable 【发布时间】:2020-05-05 15:10:56 【问题描述】:

由于某种原因,DatePicker 并不总是更新与之关联的日期变量。难道我做错了什么?我基本上可以随机滚动,有时我可以到达显示当前选择日期 (var $entryDate) 的文本与我选择的 DatePicker 显示的不同点 - 我的代码:

struct addView: View 

  @State private var entryDate: Date = Date()

  var body: some View 
      VStack 
        HStack 
          Spacer()
          DatePicker("_", selection: $entryDate, in: ...Date(), displayedComponents: .date)
            .labelsHidden()
            .datePickerStyle(WheelDatePickerStyle())
            .frame(minWidth: 0, maxWidth: .infinity, alignment: .center)
            .environment(\.locale, Locale.current)
          Spacer()
        
        Text("\(entryDate)")
      
  

【问题讨论】:

【参考方案1】:

这是一个已知的 SwiftUI 错误。 我用一些解决方法解决了它:

@State private var refresh = false

      DatePicker("_"  + (refresh ? "" : " "), selection: $entryDate, in: ...Date(), displayedComponents: .date)
        .labelsHidden()
        .datePickerStyle(WheelDatePickerStyle())
        .frame(minWidth: 0, maxWidth: .infinity, alignment: .center)
        .environment(\.locale, Locale.current)

在您的视图结束时:

.onReceive(self.$refresh)  _ in
   self.refresh.toggle()

甚至应该使用您的 labelsHidden()。

【讨论】:

使用您的建议结果:Cannot convert value of type '(_) -&gt; ()' to expected argument type '(_.Output) -&gt; Void'【参考方案2】:

这里有一个解决方法:

@State private var refresh: Bool = false

DatePicker("_"  + (refresh ? "" : " "), selection: $entryDate, displayedComponents: [.hourAndMinute])
                .datePickerStyle(.wheel)
                .labelsHidden()

然后,每当您在选择器之外编辑 $entryDate 时,调用

self.refresh.toggle()

DatePicker 会正确更新。

【讨论】:

以上是关于SwiftUI DatePicker 并不总是更新 State<Date> 变量的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 SwiftUI 中将 DatePicker 放入 ContextMenu

在打印语句 SwiftUI 上显示 DatePicker hourAndMinute

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

SwiftUI iOS 14 中 DatePicker 的中心对齐

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