为什么SwiftUI将日期格式化为;2020 M10 27“;在导航标题中?

为什么SwiftUI将日期格式化为;2020 M10 27“;在导航标题中?,swiftui,nsdateformatter,dateformatter,Swiftui,Nsdateformatter,Dateformatter,我使用的是Xcode 12.1和iOS 14.1模拟器 使用Text.init(quo:style:)的最简单代码,导航栏标题和内容视图之间的日期格式似乎有所不同: struct ContentView: View { var body: some View { NavigationView { Text(Date(), style: .date) .navigationTitle( Text(Date(), style: .date)

我使用的是Xcode 12.1和iOS 14.1模拟器

使用
Text.init(quo:style:)
的最简单代码,导航栏标题和内容视图之间的日期格式似乎有所不同:

struct ContentView: View {
  var body: some View {
    NavigationView {
      Text(Date(), style: .date)
        .navigationTitle(
          Text(Date(), style: .date)
        )
    }
  }
}
我希望标题和内容看起来像“2020年10月27日”,但标题看起来像“2020年10月27日”。我以前从未见过这种格式

将自定义格式设置程序与
Text.init(\uquo:Formatter:)
一起使用会得到相同的结果:

struct ContentView: View {
  var body: some View {
    let formatter: DateFormatter = {
      let formatter = DateFormatter()
      formatter.dateStyle = .long
      return formatter
    }()
    
    NavigationView {
      Text(Date(), formatter: formatter) // "October 27, 2020"
        .navigationTitle(
          Text(Date(), formatter: formatter) // "2020 M10 27"
        )
    }
  }
}
最后,使用
Formatter.string(from:)
预格式化字符串,得到预期的结果:

import SwiftUI

struct ContentView: View {
  var body: some View {
    let formatter: DateFormatter = {
      let formatter = DateFormatter()
      formatter.dateStyle = .long
      return formatter
    }()

    NavigationView {
      Text(formatter.string(from: Date())) // "October 27, 2020"
        .navigationTitle(
          Text(formatter.string(from: Date())) // "October 27, 2020"
        )
    }
  }
}

这是怎么回事?为了在导航标题中显示日期,我真的需要这个解决方法吗?

是的,不幸的是,它看起来像一个bug


作为解决方法,您可以创建一个扩展:

extension Text {
    static let dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .long
        return formatter
    }()

    init(date: Date) {
        self.init(Text.dateFormatter.string(from: date))
    }
}
因此,在
navigationTitle
中有相同数量的代码:

.navigationTitle(
    Text(date: Date())
)

通过子类化DateFormatter,我确定当格式化程序用于标题栏时,
区域设置
设置不正确-它被设置为空的区域设置标识符,而不是我的默认“en_US”。我仍然不知道为什么会发生这种情况,使用
.environment(\.locale,locale.current)
覆盖也没有帮助。开发论坛上一名苹果员工的建议确认这是一个bug:。我提交了FB8831937。