注意:向Apple报告错误
雷达编号:29265429(Link)
我正在使用UIDatePicker。当我给格里高利历时它工作得很好。日期从1到31
然而,当我给它伊斯兰islamicUmmAlQura
时,它给了我一个奇怪的行为。日期从1到30开始,但是在1和30以下有一个'2',这样的日子如下:2,1,2,3,4 ...... 30
我创建了一个新的空iOS项目,并将以下代码放入viewDidLoad
方法:
let picker = UIDatePicker(frame: CGRect(x: 0, y: 30, width: 0, height: 0))
picker.datePickerMode = .date
picker.date = Date()
picker.calendar = Calendar(identifier: .islamicUmmAlQura)
picker.autoresizingMask = UIViewAutoresizing.flexibleRightMargin
picker.frame.size.width = 300
view.addSubview(picker)
截图:
答案 0 :(得分:1)
让你自己的UIPicker看起来像UIDatePicker并不难,但你必须要小心,因为这个bug在NSCalendar
以及NSDatePicker
。
要明确额外的'2'是不可选择的,就像30在短月内无法选择。 NSDatePicker不会隐藏无效的日期或月份,但会使其无法选择。因此,在公历中,如果选择二月,您仍会看到29,30和31,但是尝试选择它们的选择器将达到28. DataPicker通过调用maximumRangeOfUnit:
计算出要显示的月数和天数在日历上。在伊斯兰日历中,正确的最大值为{1,30},但NSCalendar
为所有伊斯兰日历的maximumRangeOfUnit:NSCalendarUnitDay
返回{1,31}。
所以有两个错误。一个是NSCalendar说伊斯兰月可能有31天(我不相信是真的),第二个问题是NSDatePicker
显示第31天是2而不是31。 / p>
制作自己的NSDatePicker
并不是那么难。每个组件中的元素数量始终相同(只需确保手动设置30天,而不使用NSCalendar中的值)。棘手的部分是决定日期是否无效并将元素显示为灰色并且不让纠察队员依赖它。您可以使用rangeOfUnit:InUnit:forDate
获取一个月中的天数或一年中的月数。如果选择了无效元素,则将值向下移动到最高有效日期(即,如果用户选择30个月,29天选择29)。
选择一行后,您可以在NSCalendar上将日 - 月 - 年转换为dateFromComponents
的NSDate。