使用Bool使用SwiftUI动态过滤@FetchRequest-显示true,false或同时显示

时间:2019-12-20 15:13:11

标签: ios swift xcode core-data swiftui

我在(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

1 个答案:

答案 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
}