27 votes

Comportement étrange d'UIDatePicker avec le calendrier islamique

Note: Bug signalé à Apple

Radar nombre: 29265429 (Lien)

Je suis à l'aide d'un UIDatePicker. Quand je donne du calendrier Grégorien, il fonctionne très bien. Les jours commence à partir de 1 à 31

Cependant, quand je lui donne Islamique islamicUmmAlQura il me donne un drôle de comportement. Les jours commence à partir de 1 à 30, mais il y a un " 2 " au-dessus de 1 et inférieur à 30 tels que les jours sont comme suit 2,1,2,3,4 ... 30

J'ai créé un nouveau projet iOS et placé le code suivant dans l' viewDidLoad méthode:

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)

Capture d'écran:

enter image description here

1voto

Jon Rose Points 4849

Il n'est pas difficile à faire votre propre UIPicker qui ressemble à un UIDatePicker, mais vous devez être prudent, car le bug est en NSCalendar ainsi que NSDatePicker.

Juste pour être clair, l'extra " 2 " n'est pas sélectionnable, tout comme 30 n'est pas sélectionnable dans un petit mois. NSDatePicker ne cache pas non valide en jours ou en mois, mais en fait ne peut pas être sélectionnée. Ainsi, dans le calendrier Grégorien, si vous sélectionnez février, vous pourrez toujours voir les 29, 30 et 31, mais en essayant de sélectionner le sélecteur de a à 28. Le DataPicker chiffres sur combien de mois et de jours à afficher en appelant maximumRangeOfUnit: sur le calendrier. Dans un calendrier Islamique correcte maximum est de {1, 30}, mais NSCalendar retourne {1,31} pour maximumRangeOfUnit:NSCalendarUnitDay pour tous les calendriers Islamiques.

Il y a donc deux bugs. L'une est que NSCalendar est dire qu'il y a peut être de 31 jours dans un Mois Islamique (dont je ne crois pas qui est vrai), et le deuxième problème est que NSDatePicker est de montrer la 31e jour 2 au lieu de 31.

Faire votre propre NSDatePicker n'est vraiment pas dur. Le montant de l'élément dans chaque composante est toujours le même (assurez-vous de définir manuellement de 30 jours et de ne pas utiliser la valeur de NSCalendar). La partie difficile est de décider si une date n'est pas valide et en montrant l'élément de gris et de ne pas laisser le piquet se reposer sur lui. Vous pouvez utiliser rangeOfUnit:InUnit:forDate pour obtenir le nombre de jours dans un mois ou le nombre de mois dans une année. Si un élément non valide sélectionnés passer la valeur de la plus haute date valide (c'est à dire si un utilisateur sélectionne 30 dans un mois et 29 jours sélectionnez 29).

Une fois qu'une ligne est sélectionnée, vous pouvez convertir jour-mois-année, à un NSDate avec dateFromComponents sur NSCalendar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X