如何根据 SwiftUI 中的日期将事件分成列表的不同部分?

Posted

技术标签:

【中文标题】如何根据 SwiftUI 中的日期将事件分成列表的不同部分?【英文标题】:How do I separate events into different sections of a list based on a date in SwiftUI? 【发布时间】:2019-09-28 02:46:48 【问题描述】:

我正在使用提供 2019 年所有美国假期的 JSON 数据。这些数据让我可以访问名称、描述和日期。我已成功导入所有内容,但想根据月份分节列出假期。

在 SwiftUI 中,代码将变为:List -> ForEach -> Section -> ForEach -> ListRow,但我不确定如何说日期的月份是否匹配将它们放在同一部分中。我可能走错路了……

allHolidays 代表我拥有的假期数据:

List 
    ForEach(?)  month in
        Section(header: Text("Month goes here...")) 
            ForEach(self.allHolidays, id: \.name)  holiday in
                HolidayRowView(name: holiday.name, date: holiday.date)
            
        
    

我列出了所有假期列表,并在其下方列出了日期。我不能让它们分成不同的部分。

这是来自 Calendarific 的 JSON 数据的 sn-p:


    "meta": 
        "code": 200
    ,
    "response": 
        "holidays": [
            
                "name": "Name of holiday goes here",
                "description": "Description of holiday goes here",
                "date": 
                    "iso": "2018-12-31",
                    "datetime": 
                        "year": 2018,
                        "month": 12,
                        "day": 31
                    
                ,
                "type": [
                    "Type of Observance goes here"
                ]
            
        ]
    

【问题讨论】:

编辑您的问题以包含您的假期数据结构。 【参考方案1】:

在您的第一个 ForEach 中,您需要遍历所有月份。 Calendar 将为您提供几个月的本地化名称列表,因此您可以将其用作部分标题。在您的内部ForEach 中,您需要遍历给定月份(部分标题)中发生的假期,因此您必须过滤列表:

private let calendar = Calendar.current

var body: some View 
   List 
        ForEach(1...12, id: \.self)  month in
            Section(header: Text(calendar.monthSymbols[month-1])) 
                ForEach(self.allHolidays.filter(
                        calendar.component(.month, from: $0.date) == month ),
                        id: \.name)  holiday in
                    HolidayRowView(name: holiday.name,
                                   date: holiday.date)
                
            
        
    

【讨论】:

使用过滤器是解决方案,谢谢!不得不进行一些更改以适应我收到的 JSON 数据,但效果很好。

以上是关于如何根据 SwiftUI 中的日期将事件分成列表的不同部分?的主要内容,如果未能解决你的问题,请参考以下文章

聚类日期列表

在列表行中制作等宽的 SwiftUI 视图

如何根据 R 中的日期聚合数据?

如何在 SwiftUI 中以交互方式按年份过滤日期列表

如何根据 django 模板中的日期过滤列表

SwiftUI:如何根据日期每天显示一个新视图,而以前的视图持续一周