首页 > 解决方案 > 使用 Bool 使用 SwiftUI 动态过滤 @FetchRequest - 显示真、假或两者

问题描述

我在 (ListView) 中的 SwiftUI 中有一个从核心数据中提取数据的列表。我想动态过滤它。我有一个这样的 fetchRequest:

init(filter: Bool) {        
    fetchRequest = FetchRequest<Transaction>(entity: Transaction.entity(), sortDescriptors: [], predicate: NSPredicate(format: "income = %d", filter))
}

Transaction是一个具有属性income (Bool) 的核心数据实体。

在 ContentView 我这样调用 ListView :

ListView(filter: incomeTypeFilter)

我有 3 个按钮来更改过滤器(真或假代表真 = 收入,假 = 费用):

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。但是如何更改谓词以显示所有项目?既真又假?

Ps 我的代码基于这个教程:Dynamically filtering @FetchRequest with SwiftUI

标签: iosswiftxcodecore-dataswiftui

解决方案


使用两个获取请求之一,一个带有谓词,一个没有谓词,并通过让参数为可选来确定要使用哪个

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 var 可选:

@State var incomeTypeFilter :Bool? = true

并像这样制作 SHOW ALL 按钮:

Button("Show ALL") {
    self.incomeTypeFilter = nil
}

推荐阅读