SwiftUI列表.onDelete无法与已过滤的核心数据一起使用

时间:2019-11-03 00:36:11

标签: xcode swiftui

我有一个SwiftUI应用程序,它基本上是具有数据的主/详细应用程序 保留在核心数据中。基本应用程序完美运行,但是我添加了 搜索栏(通过UIViewRepresentable),而.onDelete遇到了困难 过滤后列表的功能。

如果搜索栏中有文本,我将对Core Data实体执行提取请求 包括一个谓词,用于搜索我要包括的所有文本字段。然后 显示过滤列表。再次,这按预期工作。但是,尝试 删除记录会导致崩溃。我相信这是因为IndexSet变成了 无效,但我不知道为什么会这样。无论如何,如果我重新发出电话 到.onDelete代码中的过滤列表(请参见下面的第一个.onDelete),然后 删除按预期工作。但是,即使进行了二级搜索, 返回更改后的列表时,不显示详细信息屏幕,尽管更改 保存在核心数据中。

虽然我认为必须重新获取并没有多大的代价,但我不确定 是正确的过程,并且更改不会导致列表更新。有办法吗 使用@FetchRequest包装器并动态提供谓词?我看过几个 关于Core Data中动态过滤器的SO帖子,但没有一个对我有用。

任何指导将不胜感激。

struct ContentView: View {

@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Patient.getAllPatients()) var patients: FetchedResults<Patient>
@State private var searchTerm: String = ""
@State var myFilteredPatients = Patient.filterForSearchPatients(searchText: "")
//more properties


var body: some View {
    NavigationView {
        List {
            MySearchBar(sText: $searchTerm)
            if !searchTerm.isEmpty {
                ForEach(Patient.filterForSearchPatients(searchText: searchTerm)) { patient in
                    NavigationLink(destination: EditPatient(patient: patient, photoStore: self.photoStore, myTextViews: MyTextViews())) {
                        //configure the cell etc.
                    }//NavigationLink
                }//for each
                    .onDelete { indexSet in
                    //This recreation was necessary:
                        self.myFilteredPatients = Patient.filterForSearchPatients(searchText: self.searchTerm)
                        let deleteItem = self.myFilteredPatients[indexSet.first!]
                        self.managedObjectContext.delete(deleteItem)
                        do {
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)//put up an alert here
                        }
                }
            } else {
                ForEach(self.patients) { patient in
                    NavigationLink(destination: EditPatient(patient: patient, photoStore: self.photoStore, myTextViews: MyTextViews())) {
                        //configure the cell etc
                    }//nav link
                }//for each
                    .onDelete { indexSet in
                        let deleteItem = self.patients[indexSet.first!] 
                        self.managedObjectContext.delete(deleteItem)
                        do {
                            try self.managedObjectContext.save()
                        } catch {
                            print(error)//put up and alert here
                        }
                }
            }//if else
        }//List

        //buttons and setup
    }//NavigationView
}//body

Xcode版本11.2(11B52)

0 个答案:

没有答案