如何在 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 中以交互方式按年份过滤日期列表的主要内容,如果未能解决你的问题,请参考以下文章