我有两个视图,一个视图显示对象列表,第二个视图显示每个对象的详细信息。第二个视图具有删除对象的选项。使用核心数据观察对象集并将其存储在数据库中。
在第二个视图上删除对象并强制返回到第一个视图时(使用self.mode.wrappedValue.dismiss()
),对象名称将保留在列表中。也许我错了,但我认为这不是一个有约束力的问题,而是视图不再在集合上重复的事实。
返回时如何重新加载列表?
这是列表视图:
struct AssignmentList: View {
@ObservedObject var assignmentViewModel = AssignmentViewModel()
var body: some View {
NavigationView {
VStack{
List(Array(assignmentViewModel.allAssignments), id: \.self) { assignment in
NavigationLink(destination: DetailedAssignment(assignmentName:assignment.assignmentName as! String,notes: assignment.notes as! String)){
AssignmentRow(assignmentName: assignment.assignmentName as! String)
}
}
.navigationBarTitle(Text("Assignments"))
Button(action: {
self.assignmentViewModel.retrieveAllAssignments()
}) {
Text("Retrieve")
}
}
}
}
}
第二个视图中的删除按钮:
struct DetailedAssignment: View {
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@ObservedObject var assignmentViewModel = AssignmentViewModel()
var assignmentName : String
var notes :String
var body: some View {
Button(action: {
self.assignmentViewModel.deleteAssignment(assignmentName: self.assignmentName as! String)
self.assignmentViewModel.retrieveAllAssignments()//In order to update the observed object set
self.mode.wrappedValue.dismiss()
}) {
Text("Delete")
}
}
}
}
AssignmentViewModel中的相关部分:
class AssignmentViewModel : ObservableObject
{
@Published var allAssignments : Set<Assignment>
}
从模型中删除功能:
func deleteAssignment(assignmentName : String){
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Assignment")
fetchRequest.predicate = NSPredicate(format: "assignmentName = %@", assignmentName)
do
{
let requiredAssignment = try managedContext.fetch(fetchRequest)
let objectToDelete = requiredAssignment[0] as! NSManagedObject
managedContext.delete(objectToDelete)
do{
try managedContext.save()
print("Deleted !.")
}
catch
{
print(error)
}
}
catch
{
print(error)
}
}
答案 0 :(得分:1)
我复制了该代码,我真的很想知道为什么它不起作用。但是后来我发现了错误。您正在细节视图中创建另一个新的可观察对象。这是错误的,因为您引用的是另一个对象,而不是列表视图中的第一个对象。您只需创建一次对象,然后将其传递到子视图。
在“详细信息视图”中将其更改为:
struct DetailedAssignment: View {
@Environment(\.presentationMode) var mode: Binding<PresentationMode>
@ObservedObject var assignmentViewModel : AssignmentViewModel
比那样从您的列表视图传递
NavigationLink(destination: DetailedAssignment(assignmentViewModel: assignmentViewModel, self. assignmentName:assignment.assignmentName as! String,notes: assignment.notes as! String)){
AssignmentRow(assignmentName: assignment.assignmentName as! String)
}
确保分配符合可识别的,可平等的,可哈希的。我实际上是用Array重新创建的,但是Set应该也可以工作。
编辑:
如您现在所示,您可以使用CoreData,我认为最好的方法是在ListView中使用@FetchRequest
。您将不需要Observable对象,因为FetchRequest将执行您当前正在手动执行的操作。
您必须致电...
self.assignmentViewModel.retrieveAllAssignments()//In order to update the observed object set
..在您的删除功能中。