SwiftUI中PickerDate视图进入页面时默认选中当前日期问题排查
问题原因与解决方案
核心问题:日期时间部分不匹配
你的selectedDate初始值是Date(),包含当前精确的时分秒;而PickerDate中生成的day是基于startOfWeek()的结果添加天数得到的,这个日期的时间部分是当天0点(时分秒全为0)。直接用==比较两个日期时,因为时间部分不一致,会返回false,导致默认选中状态不生效。
onAppear无效的原因也在于此——不是视图未触发生命周期方法,而是即使在onAppear中赋值,只要时间部分不匹配,选中逻辑依然不成立。
修复步骤
1. 统一日期的时间部分
在主页中,将selectedDate的初始值改为当天的开始时间,确保和PickerDate中生成的day格式一致:
@State private var selectedDate: Date = Calendar.current.startOfDay(for: Date())
2. 修改日期比较逻辑
在PickerDate视图中,不要直接用==比较完整日期,而是使用Calendar的方法只比较年月日部分:
把所有selectedDate == day的判断替换为:
Calendar.current.isDate(selectedDate, equalTo: day, toGranularity: .day)
修改后的PickerDate关键代码片段:
Text(daysOfWeek[Calendar.current.component(.weekday, from: day) - 1]) .font(customFont(15,"-Medium")) .padding(.top,15) .fontWeight(Calendar.current.isDate(selectedDate, equalTo: day, toGranularity: .day) ? .bold : .regular) Text(day, format: .dateTime.day()) .font(customFont(15,"-Medium")) .fontWeight(Calendar.current.isDate(selectedDate, equalTo: day, toGranularity: .day) ? .bold : .regular) .frame(width: 30, height: 30) .background(Calendar.current.isDate(selectedDate, equalTo: day, toGranularity: .day) ? Color.white : Color.clear) .clipShape(Circle()) .foregroundColor(.black) .padding(.bottom, 8) // 下方背景判断同理 .background(Calendar.current.isDate(selectedDate, equalTo: day, toGranularity: .day) ? Color.deepAccent : Color.accentColor)
3. 可选优化:统一日期生成逻辑
如果需要更严谨,可以在PickerDate中生成周起始日期时,基于传入的selectedDate计算,而不是固定用当前Date(),避免selectedDate非当天时周范围显示错误:
func startOfWeek() -> Date { let calendar = Calendar.current let components = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: selectedDate) return calendar.date(from: components) ?? selectedDate }
内容的提问来源于stack exchange,提问作者Ting Qu
相关产品推荐
相关产品推荐

