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

iOS11中UIDatePicker切换日历(公历转日本历/佛历)崩溃求助

解决佛历切换下UIDatePicker设置datePickerMode崩溃的问题

崩溃原因分析

你遇到的NSRangeException崩溃,是因为当系统日历切换为佛历时,直接设置datePickerView.datePickerMode = .date会触发系统内部的数组索引越界错误。佛历的年份数值远大于公历(比如2024年对应佛历2567年),iOS在处理这个特殊日历的日期选择器模式时,内部年份数组的索引计算出现了异常。

修复方案

你可以通过调整初始化顺序,或者显式指定日历类型来解决这个问题,下面是两种可行的方案:

方案1:先设置有效日期,再配置选择器模式

修改initializeBarButtons方法,先给日期选择器设置一个有效的初始日期(比如当前日期),再设置datePickerMode。这样能让系统有一个有效的参考值,避免索引计算错误:

func initializeBarButtons() {
    // 先设置当前日期作为初始值,确保选择器有有效的日期参考
    datePickerView.date = Date()
    // 再配置日期选择模式
    datePickerView.datePickerMode = .date
    datePickerView.addTarget(self, action: #selector(EmployeeDetailEditViewController.handleDatePicker), for: .valueChanged)
}

方案2:显式指定公历日历(若无需支持佛历显示)

如果你的应用不需要支持佛历显示,可以直接将日期选择器的日历设置为公历,彻底规避这个兼容性问题:

func initializeBarButtons() {
    // 强制日期选择器使用公历日历
    datePickerView.calendar = Calendar(identifier: .gregorian)
    datePickerView.datePickerMode = .date
    datePickerView.addTarget(self, action: #selector(EmployeeDetailEditViewController.handleDatePicker), for: .valueChanged)
}

补充说明

这是iOS系统在处理佛历这类非公历日历时的一个已知兼容性问题。如果需要保留系统日历的显示支持,方案1是更合适的选择;如果你的应用只需要公历,方案2则是更直接的修复方式。

内容的提问来源于stack exchange,提问作者Amey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:17:48