SwiftUI - 在Coredata中添加链接对象后视图不更新

Posted

技术标签:

【中文标题】SwiftUI - 在Coredata中添加链接对象后视图不更新【英文标题】:SwiftUI - View not updating after adding linked object in Coredata 【发布时间】:2021-06-30 23:13:06 【问题描述】:

我有一个名为 InstanceView 的 SwiftUI 视图,它显示了来自 NagivationViewInstance 的详细信息。 NavigationView 中的链接是来自 Coredata 的对象,称为 Instances,在 Coredata 中,我有一个名为 Solve 的实体。 InstanceSolve 具有一对多关系。 InstanceView 显示链接到它的Solves 列表。

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

这是NavigationView 中的List,它控制Instance 显示在InstanceView 中:

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

谢谢!

【问题讨论】:

【参考方案1】:

尝试在“InstanceView”中使用它:

@State var instance: Instance

@Binding var instance: Instance

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

【讨论】:

不幸的是,状态和绑定不起作用。我想尝试使用 ObservableObject,但我不确定如何使用 Coredata 中的类来做到这一点。这是我的实例类:pastebin.com/20hTjMFy。我认为 NSManagedObject 已经符合 ObservableObject 了?但我不确定从那里去哪里。【参考方案2】:

我想通了,并想我会发布我的解决方案,以防其他人遇到同样的问题。我可以通过在var instance: Instance 前面添加@ObservedObject 来解决这个问题。

【讨论】:

以上是关于SwiftUI - 在Coredata中添加链接对象后视图不更新的主要内容,如果未能解决你的问题,请参考以下文章

访问全局函数内的环境变量 - SwiftUI + CoreData

SwiftUI:如何从 Siri Intent 添加 CoreData 记录

SwiftUI CoreData - 如何更新获取请求和列表

浅谈CoreData海量数据(实时动态添加和删除)在SwiftUI列表中分页显示的原理及实现

使用 SwiftUI 和 CoreData 的数据

Swiftui中CoreData关系和显示图像列表