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
相关产品推荐
相关产品推荐

