SwiftUI中@Published变量更新但Text视图不刷新问题
解决SwiftUI中切换星期几视图不刷新的问题
核心问题分析
weekdayAsString函数逻辑错误:函数内部没有使用传入的date参数,而是每次调用Date().dayNumberOfWeek()获取当前真实日期的星期数,导致无论currentWeekday怎么变化,返回的字符串始终是当前真实日期的星期,视图无法正确展示切换结果。- 星期数边界未处理:直接对
currentWeekday加减会出现超出0-6范围的情况(如-1、7),导致后续显示异常。
修正后的完整代码
1. Date扩展(保持原逻辑)
extension Date { func dayNumberOfWeek() -> Int? { return Calendar.current.dateComponents([.weekday], from: self).weekday! - 1 } }
2. 修复星期数转字符串的函数
func weekdayAsString(date: Int) -> String { switch date { // 改用传入的参数作为判断依据 case 0: return "Sunday" case 1: return "Monday" case 2: return "Tuesday" case 3: return "Wednesday" case 4: return "Thursday" case 5: return "Friday" case 6: return "Saturday" default: return "" } }
3. 优化日期管理类
class GrabCurrentDate: ObservableObject { @Published var currentWeekday = Date().dayNumberOfWeek()! // 切换至前一天,处理边界循环 func previousDay() { currentWeekday = currentWeekday == 0 ? 6 : currentWeekday - 1 } // 切换至后一天,处理边界循环 func nextDay() { currentWeekday = currentWeekday == 6 ? 0 : currentWeekday + 1 } }
4. 修正后的视图代码
struct testView: View { @ObservedObject var currentDate = GrabCurrentDate() var body: some View { HStack { Image(systemName: "arrow.left") .onTapGesture { currentDate.previousDay() print(currentDate.currentWeekday) } Text(weekdayAsString(date: currentDate.currentWeekday)) Image(systemName: "arrow.right") .onTapGesture { currentDate.nextDay() } } } }
修复说明
- 修复
weekdayAsString的参数使用问题后,函数会根据currentWeekday的更新返回对应星期字符串,触发视图自动刷新。 - 新增
previousDay和nextDay方法,确保currentWeekday始终保持在0-6的有效范围内,避免无效值导致的显示异常。 - 移除视图中重复定义的
weekdayAsString函数,简化代码结构。
内容的提问来源于stack exchange,提问作者Swink
相关产品推荐
相关产品推荐

