删除对象时更新上一个视图列表

时间:2020-06-30 13:26:57

标签: ios swift swiftui

我有两个视图,一个视图显示对象列表,第二个视图显示每个对象的详细信息。第二个视图具有删除对象的选项。使用核心数据观察对象集并将其存储在数据库中。

在第二个视图上删除对象并强制返回到第一个视图时(使用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)
}

}

1 个答案:

答案 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

..在您的删除功能中。