перезагрузить FetchedResults при изменении предиката в swiftUI - PullRequest
0 голосов
/ 26 марта 2020

edit: до сих пор я думаю, что я сузил проблему, сделанную для fetchresult в просмотре списка. когда запрос (предикат) fetch изменяется, он не повторяется.


Я создаю приложение todo с использованием 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 другое значение, а затем для свойства предиката в loadItems ( ) обновит fetchrequest, затем просмотр списка перезагрузится.

Я знаю, что с этим подходом что-то не так, но я не могу понять, как это исправить. Спасибо за помощь!

1 Ответ

0 голосов
/ 26 марта 2020

Вам нужно изменить какое-то состояние, чтобы представление снова отображалось.

Попробуйте добавить @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
    }
}
...