2016-11-13 19 views
26

Lưu ý: Bug báo cáo cho AppleUIDatePicker hành vi kỳ lạ với lịch Hồi giáo

số Radar: 29265429 (Link)

Tôi đang sử dụng một UIDatePicker. Khi tôi cho Gregorian lịch nó hoạt động tốt. Những ngày bắt đầu từ 1 đến 31

Tuy nhiên, khi tôi cung cấp cho nó Hồi giáo islamicUmmAlQura nó mang lại cho tôi một hành vi lạ. Những ngày bắt đầu từ 1 đến 30 nhưng có '2' ở trên 1 và dưới 30 như vậy vào những ngày như sau 2,1,2,3,4 ... 30

Tôi đã tạo một dự án iOS trống mới và đặt đoạn mã sau vào viewDidLoad phương pháp:

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) 

Ảnh chụp màn hình:

enter image description here

+3

Đảm bảo mở báo cáo lỗi với Apple và đăng báo cáo tại đây. –

+0

@LeoNatan Tôi đã làm điều đó. Cảm ơn bạn đã nhắc nhở. Nó phải là một lỗi trong thư viện iOS. Nhưng tôi vẫn đang tìm cách giải quyết "ít nhất". – malhobayyeb

+1

Vâng, giải pháp "cuối cùng" là thực hiện lại bộ chọn ngày với chính UIPickerView. Đây là một công việc khó khăn và tẻ nhạt, nhưng có thể, đặc biệt nếu bạn chỉ cần một lịch cụ thể. –

Trả lời

1

Nó không phải là khó để làm UIPicker của riêng bạn mà trông giống như một UIDatePicker, nhưng bạn phải cẩn thận bởi vì lỗi nằm trong NSCalendar cũng như NSDatePicker.

Chỉ cần làm rõ thêm '2' không thể chọn, giống như 30 không thể chọn trong một tháng ngắn. NSDatePicker không ẩn ngày hoặc tháng không hợp lệ, nhưng làm cho chúng không thể chọn được. Vì vậy, trong lịch Gregorian nếu bạn chọn tháng hai bạn vẫn sẽ thấy 29, 30 và 31, nhưng cố gắng chọn chúng sẽ chọn đến 28. DataPicker tìm ra bao nhiêu tháng và ngày để hiển thị bằng cách gọi maximumRangeOfUnit: trên lịch. Trong lịch Hồi giáo, số tiền tối đa chính xác là {1, 30}, nhưng NSCalendar trả về {1,31} cho maximumRangeOfUnit:NSCalendarUnitDay cho tất cả các lịch Hồi giáo.

Vì vậy, có hai lỗi. Một là NSCalendar đang nói rằng có thể có 31 ngày trong một tháng Hồi giáo (mà tôi không tin là sự thật), và vấn đề thứ hai là NSDatePicker đang hiển thị ngày thứ 31 là 2 thay vì 31.

Làm của riêng bạn NSDatePicker thực sự không phải là khó. Số lượng phần tử trong mỗi thành phần luôn giống nhau (chỉ cần đảm bảo đặt 30 theo cách thủ công cho ngày và không sử dụng giá trị từ NSCalendar). Phần khó khăn là quyết định nếu một ngày không hợp lệ và hiển thị phần tử là màu xám và không để phần còn lại trên đó. Bạn có thể sử dụng rangeOfUnit:InUnit:forDate để nhận số ngày trong một tháng hoặc số tháng trong một năm. Nếu phần tử không hợp lệ được chọn, chúng sẽ di chuyển giá trị xuống ngày có giá trị cao nhất (ví dụ: nếu người dùng chọn 30 trong một tháng có 29 ngày, hãy chọn 29).

Khi một hàng được chọn, bạn có thể chuyển đổi từ ngày-tháng-năm sang NSDate bằng dateFromComponents trên NSCalendar.