如何在UICalendarView中保留预选中日期并禁用用户选取消选且不灰化日期
解决UICalendarView预选中日期且禁用选取消选不灰化的问题
你之前的问题出在误用了canSelectDate和canDeselectDate——这两个方法的作用是标记日期是否可交互,返回false会直接让系统把日期灰化,而非单纯阻止选取消选操作。要实现需求,需分开控制「日期样式」和「操作权限」:
解决方案步骤
- 保留预选中日期的设置:你之前的预选中代码有效,继续使用:
let multiDateSelection = UICalendarSelectionMultiDate(delegate: self) multiDateSelection.selectedDates = myDatabase.selectedDates() calendarView.selectionBehavior = multiDateSelection
- 修改Delegate方法分离样式与操作控制:
- 让
canSelectDate和canDeselectDate返回true,确保日期保持正常样式(不灰化); - 通过
shouldSelectDate和shouldDeselectDate返回false,拦截用户的选择/取消选择动作,同时不影响日历滑动:
- 让
// 允许日期显示为正常可交互状态(不灰化) func multiDateSelection(_ selection: UICalendarSelectionMultiDate, canSelectDate dateComponents: DateComponents) -> Bool { return true } func multiDateSelection(_ selection: UICalendarSelectionMultiDate, canDeselectDate dateComponents: DateComponents) -> Bool { return true } // 阻止实际的选择和取消操作 func multiDateSelection(_ selection: UICalendarSelectionMultiDate, shouldSelectDate dateComponents: DateComponents) -> Bool { return false } func multiDateSelection(_ selection: UICalendarSelectionMultiDate, shouldDeselectDate dateComponents: DateComponents) -> Bool { return false }
原理说明
canSelectDate/canDeselectDate:控制日期的可用性样式,返回true时日期保持正常外观,用户看到的是可点击状态;shouldSelectDate/shouldDeselectDate:控制实际操作是否执行,返回false时,用户点击日期不会触发选中或取消选中的状态变更;- 这种方式既保留了日历的横向滑动功能(
isUserInteractionEnabled保持true),也维持了预选中日期的状态,同时日期不会被灰化。
内容的提问来源于stack exchange,提问作者Henry Noon
相关产品推荐
相关产品推荐

