在swiftUI中更改谓词时重新加载FetchedResults

问题描述 投票:0回答:1

我正在使用swiftUI和Core Data构建Todo应用程序。在listView中,我有一个按钮,它将更改fetchrequest的谓词,但我无法使其工作。

listView中的代码

struct HomeListView: View {
    @Environment(\.managedObjectContext) var context
    @FetchRequest(fetchRequest: ItemEntity.loadItems()) var items: FetchedResults<ItemEntity>

    Text("someText")
        .onTapGesture {
            ItemEntity.predicateType.next() //next() is a method defined in core data entity class
        }

核心数据实体类中的代码

extension ItemEntity {
    static var sortType = sort.ascending
    static var predicateType = predicate.all

    static func loadItems() -> NSFetchRequest<ItemEntity> {
        var request: NSFetchRequest<ItemEntity> = ItemEntity.fetchRequest() as! NSFetchRequest<ItemEntity>

        var predicate: NSPredicate {
        switch predicateType {
        case .all:
            return NSPredicate(format: "type = %i", 0)
        case .imur:
            return NSPredicate(format: "type = %i", 0)
        case .unimur:
            return NSPredicate(format: "type = %i", 1)
        case .imunur:
            return NSPredicate(format: "type = %i", 2)
        case .unimunur:
            return NSPredicate(format: "type = %i", 3)
        case .entry:
            return NSPredicate(format: "type = %i", 4)
        }

        request.sortDescriptors = [sortDescriptor]
        request.predicate = predicate
        return request
    }

    enum predicate {
        case all
        case imur
        case unimur
        case imunur
        case unimunur
        case entry

        mutating func next() {
            switch self {
            case .all:
                self = .imur
            case .imur:
                self = .unimur
            case .unimur:
                self = .imunur
            case .imunur:
                self = .unimunur
            case .unimunur:
                self = .entry
            case .entry:
                self = .all
            }
        }
    }
}

想法是,当用户点击列表视图上的按钮时,它将调用next()方法并将ItemEntity类中的predicateType属性设置为另一个值,然后loadItems()中的predicate属性将更新fetchrequest,然后listview将重新加载。

我知道这种方法有问题,但是我不知道如何解决。感谢您的帮助!

core-data swiftui nsfetchrequest
1个回答
0
投票

您需要更改某些状态,以便视图重新呈现。

尝试添加@State变量,从按钮操作中更改它,并在视图中使用它:

struct HomeListView: View {
    @Environment(\.managedObjectContext) var context
    @FetchRequest(fetchRequest: ItemEntity.loadItems()) var items: FetchedResults<ItemEntity>
    @State private var refresh: Bool = false  // add a state
  var body: some View {
    Text("someText")
        .onTapGesture {
            ItemEntity.predicateType.next() 
            refresh.toggle()     // change the state
        }
        .background(toggle ? Color.clear : Color.clear)  // use the state
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.