【问题标题】:reload FetchedResults when changing the predicate in swiftUI在 swiftUI 中更改谓词时重新加载 FetchedResults
【发布时间】:2020-07-06 15:21:23
【问题描述】:

编辑:到目前为止,我认为我已经将问题范围缩小到 listview 中的 fetchresult。 当 fetchrequest(predicate) 改变时,它不会重新获取。


我正在使用 swiftUI 和 Core Data 构建一个待办事项应用程序。 在 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() 中的谓词属性将更新 fetchrequest,然后是列表视图将重新加载。

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

【问题讨论】:

    标签: core-data swiftui nsfetchrequest


    【解决方案1】:

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

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

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

    【讨论】:

    • 我在这个视图中添加了另一个状态但问题仍然存在,我打印了 fetchrequest 并且它确实发生了变化,但我认为问题是当 fetchrequest 发生变化时,它不会重新获取列表,如何我要手动重新获取吗?
    • 我遇到了一个非常相似的问题,你找到答案了吗?
    猜你喜欢
    • 2022-01-07
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多