我的UIDatePicker使用公历或用户选择的其他日历。当他们选择日历时,拾取器会像这样显示纪元年份:"平成30年“或”令和2年“。
在iOS 14之前,它一直工作得很好。现在在iOS 15上,它只是"30“或"2”。这是一个bug吗,或者有没有办法修复它,这样时代就会在年份之前显示出来?
我使用以下代码在我的应用程序上重新加载UIDatePicker。
func reloadPickers() -> Void {
var title = timeZone?.localizedName(for: .standard, locale: locale)
if (timeZone?.isDaylightSavingTime(for: dateTimeComplete!))! {
title = timeZone?.localizedName(for: .daylightSaving, locale: locale)
} else {
}
buttonTimeZone.setTitle(title, for: .normal)
let originalDateSecondsOnly = NSCalendar.current.dateComponents([.second], from: dateTimeComplete!)
secondPickerView.reloadAllComponents()
if arraySeconds?.count != 0 {
secondPickerView.selectRow(second, inComponent: 0, animated: false)
}
let components = calendar.dateComponents([.era, .year, .month, .day, .hour, .minute], from: dateTimeComplete!)
let dateWithoutSecond = calendar.date(from: components)
datePicker.date = dateWithoutSecond!
datePicker.timeZone = timeZone!
datePicker.calendar = calendar
datePicker.locale = locale
datePicker.addTarget(self, action: #selector(DateChooserViewController.dateUpdated), for: .valueChanged)
timePicker.date = dateWithoutSecond!
timePicker.timeZone = timeZone!
timePicker.calendar = calendar
timePicker.locale = locale
timePicker.addTarget(self, action: #selector(DateChooserViewController.timeUpdated), for: .valueChanged)
}
@IBAction func switchCalendarButtonTapped(_ sender: Any) { //ver2.0.4
print("switchCalendarButtonTapped")
if let alternateCalendar = UserDefaults.standard.value(forKey: "alternateCalendar") as? String {
if useAlternateCalendar {
useAlternateCalendar = false
calendar = Calendar.current
reloadPickers()
} else {
switch alternateCalendar {
case "buddhist":
calendar = Calendar.init(identifier: .buddhist)
case "chinese":
calendar = Calendar.init(identifier: .chinese)
case "coptic":
calendar = Calendar.init(identifier: .coptic)
case "ethiopicAmeteAlem":
calendar = Calendar.init(identifier: .ethiopicAmeteAlem)
case "ethiopicAmeteMihret":
calendar = Calendar.init(identifier: .ethiopicAmeteMihret)
case "gregorian":
calendar = Calendar.init(identifier: .gregorian)
case "hebrew":
calendar = Calendar.init(identifier: .hebrew)
case "indian":
calendar = Calendar.init(identifier: .indian)
case "islamic":
calendar = Calendar.init(identifier: .islamic)
case "islamicCivil":
calendar = Calendar.init(identifier: .islamicCivil)
case "islamicTabular":
calendar = Calendar.init(identifier: .islamicTabular)
case "islamicUmmAlQura":
calendar = Calendar.init(identifier: .islamicUmmAlQura)
case "japanese":
calendar = Calendar.init(identifier: .japanese)
case "persian":
calendar = Calendar.init(identifier: .persian)
case "republicOfChina":
calendar = Calendar.init(identifier: .republicOfChina)
default:
print("do nothing")
}
useAlternateCalendar = true
reloadPickers()
if !(UIApplication.shared.delegate as! AppDelegate).canUseTimeCalculation() { //ver2.0.6
let alert = UIAlertController(title: NSLocalizedString("Please Upgrade", comment: ""), message: NSLocalizedString("Please upgrade to enable this function.", comment: ""), preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("Upgrade", comment: ""),
style: .default,
handler: {
(action: UIAlertAction!) -> Void in
print("Upgrade is pressed")
self.useAlternateCalendar = false
self.calendar = Calendar.current
self.reloadPickers()
self.openInAppPurchaseForTimeCalcVC(forFree: false)
}))
alert.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""),
style: .cancel,
handler: {
(alert: UIAlertAction!) in
print("Cancel is pressed")
self.useAlternateCalendar = false
self.calendar = Calendar.current
self.reloadPickers()
}))
self.show(alert, sender: self)
} else {
(presentingViewController as! ViewController).shouldCountNumberOfTimeCalcTrial = true
}
}
} else {
if Locale.current.regionCode == "JP" {
if Calendar.current.identifier == .gregorian {
UserDefaults.standard.setValue("japanese", forKey: "alternateCalendar")
} else {
UserDefaults.standard.setValue("gregorian", forKey: "alternateCalendar")
}
UserDefaults.standard.synchronize()
switchCalendarButtonTapped(self)
} else {
changeAlternateCalendar()
}
}
}发布于 2021-11-14 08:04:57
我在使用UIDatePicker的中国日历时也遇到了同样的问题,但我发现,在iOS 15的“手机”应用程序中,用于设置联系人生日的UIDatePicker显示正常。
我发现这个UIDatePicker的locale属性设置如下:
Locale(identifier: "zh_CN@calendar=chinese")因此,我假设您应该将其设置为:
let identifier = Locale.autoupdatingCurrent.identifier + "@calendar=chinese"
datePicker.locale = Locale(identifier: identifier)在我的iOS 15设备上显示"平成30年“和"令和2年”。
https://stackoverflow.com/questions/69917510
复制相似问题