我有一个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)