我在(ListView)中的SwiftUI中有一个列表,该列表从Core Data中提取数据。我想动态过滤。我有一个这样的fetchRequest:
init(filter: Bool) {
fetchRequest = FetchRequest<Transaction>(entity: Transaction.entity(), sortDescriptors: [], predicate: NSPredicate(format: "income = %d", filter))
}
交易是具有属性收入(布尔)的核心数据实体。
在ContentView中,我这样调用ListView:
ListView(filter: incomeTypeFilter)
我有3个按钮来更改过滤器(true或false代表true =收入,false =费用):
Button("Show income") {
self.incomeTypeFilter = true
}
Button("Show expenses") {
self.incomeTypeFilter = false
}
Button("Show ALL") {
// I don't know how to show ALL items in the list. Both true and false.
}
显示收入和支出工作的按钮。他们将self.incomeTypeFilter更改为true或false。但是如何更改谓词以显示所有项目?真与假?
P.s。我的代码基于本教程:Dynamically filtering @FetchRequest with SwiftUI
答案 0 :(得分:1)
使用两个获取请求中的一个,一个带有谓词,一个不带谓词,并通过使参数为可选来确定使用哪个
init(filter: Bool?) {
if let filter = filter {
fetchRequest = FetchRequest<Transaction>(entity: Transaction.entity(), sortDescriptors: [], predicate: NSPredicate(format: "income = %d", filter))
} else {
fetchRequest = FetchRequest<Transaction>(entity: Transaction.entity(), sortDescriptors: [])
}
}
所以所有这些都相当于用nil调用init
编辑:
及以后: 将ContentView中的IncomeTypeFilter变量设为可选:
@State var incomeTypeFilter :Bool? = true
并使“ SHOW ALL”按钮如下所示:
Button("Show ALL") {
self.incomeTypeFilter = nil
}