SwiftUI中选择当前日期时如何关闭DatePicker?
修复SwiftUI DatePicker选择当前日期不关闭的问题
问题原因
你给DatePicker添加了.id(testDate)修饰符:当选择非当前日期时,testDate的值发生变化,id更新触发视图重建,系统自动关闭日期选择弹窗;但选择当前日期时,testDate的值没有改变,id保持不变,视图不会重建,弹窗也就不会自动关闭。
解决方案
根据你的需求,有两种可行的修复方式:
方式一:移除不必要的.id(testDate)修饰符
如果没有强制刷新视图的特殊需求,直接去掉.id(testDate)即可,系统会正常处理日期选择后的弹窗关闭逻辑:
@State private var testDate = Date() DatePicker( "", selection: $testDate, displayedComponents: [.date] ) // 移除.id(testDate)
方式二:保留id逻辑时手动触发状态更新
如果你确实需要保留.id相关的视图刷新逻辑,可以添加一个额外的状态变量,在选择当前日期时强制触发id变化:
@State private var testDate = Date() @State private var pickerRefreshTrigger = 0 // 新增触发变量 DatePicker( "", selection: $testDate, displayedComponents: [.date] ) .onChange(of: testDate) { newValue in // 判断是否选择的是当前日期(精确到天) let calendar = Calendar.current let isSameDay = calendar.isDate(newValue, inSameDayAs: Date()) if isSameDay { // 强制更新trigger,让id变化 pickerRefreshTrigger += 1 } } .id("\(testDate)-\(pickerRefreshTrigger)") // 组合id
这个方法通过组合日期和触发变量作为id,当选择当前日期时,触发变量递增导致id更新,视图重建后弹窗会自动关闭。
内容的提问来源于stack exchange,提问作者oaranger
相关产品推荐
相关产品推荐

