如何修改SwiftUI DatePicker中显示的日期文本(如替换为Today)?
解决SwiftUI DatePicker自定义日期显示(如替换为Today)的问题
无需自定义DatePickerStyle,利用iOS15+提供的formatter参数即可实现需求,以下是具体实现方式:
方法1:利用系统相对日期格式化
如果只需自动显示“Today”“Yesterday”这类相对日期,直接开启DateFormatter的相对日期格式化功能即可:
import SwiftUI struct ContentView: View { @State private var myDate = Date() // 自定义日期格式化器 private let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .medium // 设置非相对日期的显示格式 formatter.timeStyle = .none formatter.doesRelativeDateFormatting = true // 启用相对日期显示 return formatter }() var body: some View { DatePicker( "What date?", selection: $myDate, formatter: dateFormatter ) .padding() } }
方法2:完全自定义日期显示逻辑
如果需要更精准的控制(比如仅将今天替换为“Today”,其他日期用指定格式),可以自定义DateFormatter子类:
import SwiftUI // 自定义格式化器,重写日期转换逻辑 class CustomDateFormatter: DateFormatter { override func string(from date: Date) -> String { let calendar = Calendar.current // 判断是否为今天 if calendar.isDateInToday(date) { return "Today" } else { // 设置非今天的日期格式 self.dateFormat = "d MMM yyyy" return super.string(from: date) } } } struct ContentView: View { @State private var myDate = Date() private let customFormatter = CustomDateFormatter() var body: some View { DatePicker( "What date?", selection: $myDate, formatter: customFormatter ) .padding() } }
注意事项
- 上述方法依赖iOS15、macOS12、tvOS15、watchOS8及以上版本的API;
- 若需兼容更低版本,可通过
Text叠加透明DatePicker的方式实现:将自定义文本显示在前台,背后放置透明的DatePicker以保留交互逻辑。
内容的提问来源于stack exchange,提问作者Brendan White
相关产品推荐
相关产品推荐

