【问题标题】:How to make a SwiftUI picker for weekdays in a locale-agnostic way如何以与语言环境无关的方式为工作日制作 SwiftUI 选择器
【发布时间】:2023-01-18 11:24:28
【问题描述】:

我很好奇,我怎样才能最好地使用 SwiftUI 形式的控件来表示一周中的通用日期(例如星期二),以便控件中表示的星期几遵循区域设置约定(例如星期日,星期一,.. . Saturday in US, but lundi, mardi, ..., dimanche in France)但潜在价值不受影响?

如果用户更改语言环境,则基础数据(和选择)不应更改。选择应保持一致,但 UI 应更新以反映语言环境。所以在上面的例子中,用户会选择“星期二”,将区域设置更改为法国,并且选择会变成“狂欢节”,即使这是列表中的第二项,而不是美国的第三项) .

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    这种方法应该大部分有效。它不会考虑不兼容的日历之间的转换,但几乎所有语言环境的日历都基于公历,因此至少对于那些日历,它应该提供所需的行为。

    import SwiftUI
    
    // This extension adapted from https://stackoverflow.com/a/74035064/14840926
    extension Calendar {
        /// Array of weekday values
        /// - Returns: An array of `Int` that represent the days of the week where 1 = Sunday and 7 = Saturday.
        ///  Should Foundation ever support calendars with weekdays != 7, the mapping breaks.
        func orderedWeekdays() -> [Int] {
            return Array(firstWeekday...(weekdaySymbols.count)) + Array(1..<firstWeekday)
        }
    }
    
    struct WeekdayMenuInAForm: View {
        @State private var universalWeekday = 2
        @State private var localeID = "en_US"
        var body: some View {
            let locale = Locale(identifier: localeID)
            let calendar = locale.calendar
            let weekdaySymbols = calendar.weekdaySymbols    // Always starts at "Sunday"
            
            Form {
                Picker("Locale", selection: $localeID) {
                    ForEach(["ar_AR", "en_US", "en_UK", "fr_FR", "fr_CA", "he_IL"], id: .self) { locale in
                        Text(locale)
                    }
                }
                Picker("Weekday", selection: $universalWeekday) {
                    ForEach(calendar.orderedWeekdays(), id: .self) { weekdayIndex in
                        Text(weekdaySymbols[weekdayIndex-1]).tag(weekdayIndex)
                    }
                }
                
                Text("The stored value of our weekday is (universalWeekday)")
            }
        }
    }
    
    struct WeekdayMenuInAForm_Previews: PreviewProvider {
        static var previews: some View {
            WeekdayMenuInAForm()
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 2012-12-09
      • 1970-01-01
      • 2018-09-16
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多