ios - 如何在 SwiftUI 中以交互方式按年份过滤日期列表
问题描述
我有一个来自核心数据实体的 NSManagedObject 子类MyEntity
:
@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))
}
}
}
我想单击一个按钮,列表应动态过滤相关年份。
如何动态过滤列表?
解决方案
您可以添加一个属性来存储您选择的年份:
@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
}
推荐阅读
- opencv - 如何增加 RGB 图像中的黄色像素
- reactjs - 无法将参数成功传递到另一个 .js 文件/屏幕
- python - 熊猫数据框分组和排序
- mysql - 使用 DATE_FORMAT() 和 IN 获取总和
- google-analytics - BigQuery:识别交易前的所有命中
- javascript - Javascript函数不给类
- php - Yii2的mongodb集合——获取嵌套数组的所有内容
- sql-server - 从具有逗号分隔值的内部查询中获取结果 - SQL Server
- javascript - 如何更改 Dynamics 365 实体表单上的 Tab 键顺序?
- javascript - 使用 Moment js 进行 DOB 验证