Xcode 14.1中Preview locale功能失效问题咨询
问题描述
根据苹果官方文档,我们应当可以在SwiftUI预览中设置locale来切换本地化显示,但在Xcode 14.1(版本号14B47b)中,以下代码并未生效:
import SwiftUI struct TestView: View { var timeFormatter: DateFormatter { let formatter = DateFormatter() formatter.dateStyle = .full formatter.timeStyle = .none return formatter } var body: some View { Text(timeFormatter.string(from: Date.now)) } } struct TestView_Previews: PreviewProvider { static var previews: some View { TestView().environment(\.locale, .init(identifier: "fr_FR")) } }
预览效果如下:
请问是否有遗漏的设置?这是否是已知问题?
解决方案
这不是Xcode的已知问题,而是代码逻辑的问题:你自定义的DateFormatter没有关联SwiftUI环境中的locale,它默认使用系统当前locale,所以预览里设置的环境locale不会生效。
可以通过两种方式修复:
方法1:让DateFormatter绑定环境locale
通过@Environment获取环境中的locale,注入到自定义的DateFormatter中:
import SwiftUI struct TestView: View { @Environment(\.locale) private var locale var timeFormatter: DateFormatter { let formatter = DateFormatter() formatter.dateStyle = .full formatter.timeStyle = .none formatter.locale = locale // 关联环境locale return formatter } var body: some View { Text(timeFormatter.string(from: Date.now)) } } struct TestView_Previews: PreviewProvider { static var previews: some View { TestView().environment(\.locale, .init(identifier: "fr_FR")) } }
方法2:使用SwiftUI原生日期格式化(更推荐)
直接借助SwiftUI的Text自带日期格式化能力,它会自动响应环境中的locale,无需自定义DateFormatter:
import SwiftUI struct TestView: View { var body: some View { Text(Date.now, style: .date) } } struct TestView_Previews: PreviewProvider { static var previews: some View { TestView().environment(\.locale, .init(identifier: "fr_FR")) } }
如果需要更自定义的格式,可使用formatted(_:)方法:
Text(Date.now.formatted(.dateTime.day().month().year().weekday()))
修改后,预览中的fr_FR locale设置就能正常生效,显示法语格式的日期。
内容的提问来源于stack exchange,提问作者adauguet
相关产品推荐
相关产品推荐

