SwiftUI中如何根据当前时间动态控制分段选择器的选项显示?
实现按时间过滤时段Picker的方案
要实现根据当前时间动态隐藏时段、无可用时段时显示提示的需求,可以按照以下步骤修改你的SwiftUI代码:
1. 重构时段数据结构
把原来的字符串数组改成包含显示文本和截止小时的结构体,方便后续根据时间判断是否显示该时段:
struct TimeSlot: Identifiable { let id = UUID() let displayText: String let cutoffHour: Int // 超过这个小时就隐藏该时段 } // 定义所有时段(注意把12小时制转成24小时制,避免时间判断出错) let timeSlots: [TimeSlot] = [ TimeSlot(displayText: "8:00 - 11:00", cutoffHour: 8), TimeSlot(displayText: "11:00 - 14:00", cutoffHour: 11), TimeSlot(displayText: "14:00 - 17:00", cutoffHour: 14) ]
2. 获取当前时间的小时数
通过Calendar获取当前时间的小时,用来做过滤判断:
private var currentHour: Int { Calendar.current.component(.hour, from: Date()) }
3. 过滤出可用时段
根据当前小时,过滤出还未到截止时间的时段:
private var availableTimeSlots: [TimeSlot] { timeSlots.filter { currentHour < $0.cutoffHour } }
4. 动态渲染UI
根据可用时段数组的状态,决定显示Picker还是提示文本:
@State private var selectedTime = "" var body: some View { VStack { if availableTimeSlots.isEmpty { // 无可用时段时显示提示 Text("今日已无可用时段") .foregroundColor(.gray) .padding() } else { // 有可用时段时显示Picker Picker("Start time", selection: $selectedTime) { ForEach(availableTimeSlots) { slot in Text(slot.displayText) .tag(slot.displayText) // 绑定选中值到selectedTime } } .padding() .pickerStyle(SegmentedPickerStyle()) } } }
关键说明
- 用
Identifiable结构体是为了ForEach可以直接遍历,无需手动指定id: \.self - 转成24小时制的时间判断更准确,不会出现上午/下午的混淆问题
filter方法会自动筛选出符合条件的时段,逻辑清晰易维护
内容的提问来源于stack exchange,提问作者user17864647
相关产品推荐
相关产品推荐

