我正在尝试更新NSManagedObject(Training
)的属性更新的SwiftUI(子)视图。
该属性是nsorderedset(exerciceHistories
)。
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,即显示的工作表,我们可以在其中编辑训练属性nsorderedset(exerciceHistories
的一个元素:
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中的对象已经很好地更新了。