首页 > 解决方案 > SwiftUI - 在Coredata中添加链接对象后视图不更新

问题描述

我有一个名为 的 SwiftUI 视图InstanceView,它显示了Instance来自 a的详细信息NagivationView。中的链接NavigationView是 Coredata 中称为Instances 的对象,在 Coredata 中,我有一个名为Solve. Instance与 有一对多的关系SolveInstanceView显示Solve链接到它的 s 列表。

我的问题是,当我创建一个新Solve的 并将其添加到InstanceInstanceView的 中时,新的解决方案不会出现在 中,InstanceView直到我在 中选择不同InstanceNavigationView,并返回到原来的Instance.

这是控件的List内部,如下所示:NavigationViewInstanceInstanceView

List {
    ForEach(Array(zip(instances.indices, instances)), id: \.0) { index, instance in
        NavigationLink(destination: InstanceView(instance: instance), tag: index, selection: $selectedInstanceIndex) {
            InstanceRow(instance: instance)
        }
    }
}

这是InstanceView

struct InstanceView: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    var instance: Instance
    
    var body: some View {
        List {
            ForEach(instance.solveArray, id: \.self) { solve in
                Text(String(solve.time))
            }
        }
        .navigationTitle(instance.wrappedName)
        .navigationSubtitle(instance.wrappedPuzzle)
        
        Button("add solve") {
            addSolve()
        }
        
    }
    
    private func addSolve() {
        withAnimation {
            let newSolve = Solve(context: viewContext)
            newSolve.time = 3.2
            newSolve.dnf = false
            newSolve.plusTwo = false
            newSolve.timestamp = Date()

            instance.addToSolve(newSolve)

            do {
                try viewContext.save()
            } catch {
                let nsError = error as NSError
                fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
            }
        }
    }
}

所以我想知道如何强制InstanceView更新,以便它显示Solve从里面添加的新内容。

谢谢!

标签: swiftcore-dataswiftuiswiftui-navigationview

解决方案


尝试在“InstanceView”中使用它:

@State var instance: Instance

或者

@Binding var instance: Instance

如果这不起作用,你最好的办法是让“Instance”成为一个类和 ObservableObject 并这样做。


推荐阅读