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

如何在FSCalendar的shouldSelect方法中仅禁用过去日期

解决FSCalendar禁用过去日期的问题

别担心,这个需求其实很容易实现!你只需要在shouldSelect代理方法里做简单的日期对比,就能精准禁用今日之前的所有日期,同时保留今日及未来日期的选择权限。

具体代码实现

直接替换你的代理方法为下面的代码:

func calendar(_ calendar: FSCalendar, shouldSelect date: Date, at monthPosition: FSCalendarMonthPosition) -> Bool {
    // 获取当前日期的"午夜时刻"(也就是当天的起始时间)
    let todayStart = Calendar.current.startOfDay(for: Date())
    // 将选中的日期也转换为当天的起始时间,避免时间部分干扰对比
    let selectedDayStart = Calendar.current.startOfDay(for: date)
    
    // 只要选中的日期起始时间 >= 今天的起始时间,就允许选择
    return selectedDayStart >= todayStart
}

为什么要这么写?

  • 直接用Date()对比会有问题:比如当前时间是下午2点,如果你选今天上午10点的日期,直接对比的话date < Date()会返回true,导致今天的日期也被禁用。
  • 用startOfDay(for:)把两个日期都统一转换为当天的0点,这样整个今天的所有时刻都会被判定为"大于等于今天",保证今天可以正常选择,而昨天及更早的日期会被彻底禁用。

额外调整

如果你的需求是连今天也禁用,只需要把判断条件改成:

return selectedDayStart > todayStart

内容的提问来源于stack exchange,提问作者Дмитрий Деникаев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:51:10