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

Posted

技术标签:

【中文标题】如何在 SwiftUI 中以交互方式按年份过滤日期列表【英文标题】:How to filter a list of dates by year interactively in SwiftUI 【发布时间】:2020-07-03 08:00:03 【问题描述】:

我有一个来自核心数据实体MyEntity 的 NSManagedObject 子类:

@NSManaged public var name: String
@NSManaged public var date: Date

和一个列表。我准备了一个 ScrollView,其中包含可用于过滤列表的按钮(?)

func groupYears(fetchedResults: FetchedResults<MyEntity>) -> [Int] 
    var result = [Int]()
    for fetchedResult in fetchedResults 
        let component = Calendar.current.dateComponents([.year], from: fetchedResult.date)
        if !result.contains(component.year!) 
            result.append(component.year!)
        
    
    return result

@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \MyEntity.date, ascending: true)]) var fetchedResults: FetchedResults<MyEntity>
VStack 
    ScrollView(.horizontal, showsIndicators: false) 
        HStack(spacing: 15) 
            Button(action: )  Text("all") 
            ForEach(groupYears(fetchedResults: fetchedResults), id: \.self)  year in
                Button(action: )  Text(String(year)) 
            
        
    
    List(fetchedResults, id: \.self)  result in
        VStack(alignment: .leading) 
            Text(result.name)
            Text(dateFormatter.string(from: result.date))
        
    

我想点击一个按钮,列表应该动态过滤相关年份。

如何动态过滤列表?

【问题讨论】:

这能回答你的问题吗? How to properly group a list fetched from CoreData by date? @pawello2222 也许你在我编辑之前回答了。无论如何谢谢你。我现在想如何动态过滤列表? 【参考方案1】:

您可以添加一个属性来存储您选择的年份:

@State var selectedYear: Int?
Button(action: 
    self.selectedYear = nil
)  
    Text("all") 

ForEach(groupYears(fetchedResults: fetchedResults), id: \.self)  year in
    Button(action: 
        self.selectedYear = year
    )  
        Text(String(year)) 
    

然后按所选年份过滤列表:

ForEach(fetchedResults.filter( isDateInSelectedYear($0.date) ), id: \.self)  ...
func isDateInSelectedYear(_ date: Date) -> Bool 
    if selectedYear == nil 
        return true
    
    return Calendar.current.component(.year, from: date) == selectedYear

【讨论】:

谢谢!我可以对“全部”按钮应用什么逻辑? @T.Karter 您可以将selectedYear 设为可选。然后,如果它是 nil,则在 isDateInSelectedYear 中返回 true。

以上是关于如何在 SwiftUI 中以交互方式按年份过滤日期列表的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 GridView 按年份过滤日期

Django按日期范围过滤但不包括年份

如何按月份和年份输入过滤具有日期时间索引的数据框?熊猫

谓词,从 NSDate 中按年份过滤,产生一个 nil 日期和一个讽刺的 Xcode 错误

按年份过滤大型数据集

按用户选择的日期过滤