You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:15:13