为什么 SwiftUI 在 navigationTitle 中将日期格式设置为“2020 M10 27”?

Why does SwiftUI format dates as "2020 M10 27" in navigationTitle?

我正在使用 Xcode 12.1 和 iOS 14.1 模拟器。

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

struct ContentView: View {
  var body: some View {
    NavigationView {
      Text(Date(), style: .date)
        .navigationTitle(
          Text(Date(), style: .date)
        )
    }
  }
}

我希望标题和内容看起来像“2020 年 10 月 27 日”,但标题看起来像“2020 M10 27”。我以前从未见过这种格式。

将自定义格式化程序与 Text.init(_: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"
        )
    }
  }
}

最后,pre-formatting 带有 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"
        )
    }
  }
}

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

是的,不幸的是它看起来像一个错误。


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

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())
)