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

使用Airbnb Horizon Calendar点击超范围日期无法清空选中日期范围

问题分析与修复方案

你的代码逻辑里,当点击已选中范围外的日期时,当前执行的是扩展选中范围的操作(将新日期并入现有范围),而非把selectedDateRange置为nil,这就是问题的核心。

修复后的代码

.days { day in
  DayView(dayNumber: day.day, isSelected: isDaySelected(day))
    .onTapGesture {
      guard let dayDate = calendar.date(from: day.components) else { return }
      if let selectedDateRange = selectedDateRange {
        if selectedDateRange.contains(dayDate) || 
           selectedDateRange.lowerBound == dayDate || 
           selectedDateRange.upperBound == dayDate {
          // 点击范围内或边界日期:清空选中状态
          self.selectedDateRange = nil
        } else {
          // 点击范围外日期:清空选中状态(替换原扩展范围的逻辑)
          self.selectedDateRange = nil
        }
      } else {
        // 无选中状态时:选中当前日期
        self.selectedDateRange = dayDate...dayDate
      }
    }
}

逻辑说明

  • 调整后,只要已有选中范围,无论点击范围内、边界还是范围外的日期,都会将selectedDateRange置为nil,满足你点击范围外日期清空选中的需求。
  • 如果你实际需求是点击范围外日期时切换为选中该单一日期(而非清空),可以把范围外分支的代码改成self.selectedDateRange = dayDate...dayDate。
  • 额外优化了日期转换的强制解包,改用guard let做安全处理,避免因日期转换失败导致崩溃。

内容的提问来源于stack exchange,提问作者Ali Düşkün

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:55:56