在NSManagedObject上更新SwiftUI视图

我正在尝试更新NSManagedObject(Training)的属性更新的SwiftUI(子)视图。 该属性是nsorderedsetexerciceHistories)。

Training类的零件:

extension Training {

    ...

    @NSManaged public var date: Date
    @NSManaged public var exerciceHistories: nsorderedset
}

主视图为TrainingDetail,显示Training的详细信息:

struct TrainingDetail: View {
    @Environment(\.managedobjectcontext) var managedobjectcontext
    
    @ObservedObject var training: Training
    ...
    
    var body: some View {
        ZStack {
            ...
            ScrollView(.vertical,showsIndicators: false) {
                VStack(spacing: 0) {
                    ...
                    TrainingDetailaction(training: training,new: new) //-> View that creates sheet to edit one element of training property nsorderedset (`exerciceHistories`)
                    TrainingDetailExercices(training: training,editing: $new) //-> View displaying training property nsorderedset (`exerciceHistories`)
                        .padding()
                }}
                ....
            }
            ...
        }
    }

TrainingDetailExercices的有趣部分,其中打开了编辑表:

struct TrainingDetailExercices: View {
    @Environment(\.managedobjectcontext) var managedobjectcontext
    
    @ObservedObject var training: Training

    var body: some View {

...

                     ForEach(training.exerciceHistories.array as! [ExerciceHistory],id: \.self) {
                    exerciceHistory in

                     ExerciceHistoryRow(exerciceHistory: exerciceHistory)
                            .padding(.bottom,10)
                    }.sheet(isPresented: $showEditView,onDismiss: {
                    ...
                },content: {
                TrainingAddExercice(training: self.training,...)
                    .environment(\.managedobjectcontext,self.managedobjectcontext)
            })

TrainingAddExercice,即显示的工作表,我们可以在其中编辑训练属性nsorderedsetexerciceHistories的一个元素:

struct TrainingAddExercice: View {
    ...
    @ObservedObject private var trainingAddExerciceViewModel: TrainingAddExerciceViewModel
    
    @ObservedObject var training: Training
    ...
    
}

TrainingAddExercice中保存并关闭工作表的功能:

    private func trailingNavButtons() -> some View {
            HStack{
                ....
                
                Button(action: {
                    self.trainingAddExerciceViewModel.save(exerciceHistory: self.exerciceHistory,to: self.managedobjectcontext,for: self.training)
    
    //here I'm trying to force update by creating a new NSMutableOrderedSet and assign it to training (because NSMutableOrderedSet is class,not struct) 

                    let newExercicesHistories = NSMutableOrderedSet(orderedSet: self.training.exerciceHistories)
                    self.training.exerciceHistories = newExercicesHistories
                    self.show = false
              
  },label: {
                ...
            }).disabled(...)
        }
    }

我不明白的一件事是,当我向training.exerciceHistories中添加/删除一个ExerciceHistory时,查看更新,但在编辑一个ExerciceHistory时却不查看更新,因此我试图通过创建新的OrderedSet来强制

CoreData中的对象已经很好地更新了。

iCMS 回答:在NSManagedObject上更新SwiftUI视图

花了很长时间尝试理解行为并使用了我对SwiftUI,CoreData和Combine的全部了解之后,我终于像这样将id添加到我的ForEach中来“修复”:

ForEach(training.exerciceHistories.array as! [ExerciceHistory],id: \.self) {
exerciceHistory in
    ExerciceHistoryRow(exerciceHistory: exerciceHistory)
    .padding(.bottom,10)
}.id(UUID())
本文链接:https://www.f2er.com/1784189.html

大家都在问