首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用日文日历时,iOS 15上的UIDatePicker会停止显示era

使用日文日历时,iOS 15上的UIDatePicker会停止显示era
EN

Stack Overflow用户
提问于 2021-11-10 17:14:50
回答 1查看 166关注 0票数 0

我的UIDatePicker使用公历或用户选择的其他日历。当他们选择日历时,拾取器会像这样显示纪元年份:"平成30年“或”令和2年“。

在iOS 14之前,它一直工作得很好。现在在iOS 15上,它只是"30“或"2”。这是一个bug吗,或者有没有办法修复它,这样时代就会在年份之前显示出来?

我使用以下代码在我的应用程序上重新加载UIDatePicker。

代码语言:javascript
复制
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()
        }
    }
            
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-14 08:04:57

我在使用UIDatePicker的中国日历时也遇到了同样的问题,但我发现,在iOS 15的“手机”应用程序中,用于设置联系人生日的UIDatePicker显示正常。

我发现这个UIDatePicker的locale属性设置如下:

代码语言:javascript
复制
Locale(identifier: "zh_CN@calendar=chinese")

因此,我假设您应该将其设置为:

代码语言:javascript
复制
let identifier = Locale.autoupdatingCurrent.identifier + "@calendar=chinese"
datePicker.locale = Locale(identifier: identifier)

在我的iOS 15设备上显示"平成30年“和"令和2年”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69917510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档