更新 CoreData 中的数据及其在视图中的值

Posted

技术标签:

【中文标题】更新 CoreData 中的数据及其在视图中的值【英文标题】:Update data in CoreData and its value in a view 【发布时间】:2020-05-30 20:53:40 【问题描述】:

我是使用 Swift 和 CoreData 开发的新手。我一直在努力使用以下代码,该代码显示一个视图,其中包含与 CoreData 一起存储的学生的一些信息。视图中显示的“提问”按钮会更新 student.questionAskedClass,但视图不会更新其值。

该值在内部明显更新,因为如果我重新启动应用程序,我可以看到该值已更新。但我希望看到它实时更新。

感谢您的帮助, 弗朗索瓦

import SwiftUI

struct StudentView: View 
  @Environment(\.managedObjectContext) var managedObjectContext

  var student: Student

  var body: some View 
    VStack(alignment: .leading) 
      Text("\(student.firstName)").font(.headline).foregroundColor(Color.black)
      Text("\(student.lastName)").font(.headline).foregroundColor(Color.gray)
      Spacer().frame(height: 10)
      Text("\(student.email)").font(.headline).foregroundColor(Color.gray)
      Spacer().frame(height: 10)
      Text("Number of questions asked: \(student.questionAskedClass)").font(.headline).foregroundColor(Color.gray)
      Button(action: 
        self.askQuestion()
      ) 
        Text("Ask question")
      
    
  

  func askQuestion() 
    self.managedObjectContext.performAndWait 
      self.student.questionAskedClass += 1
      try? self.managedObjectContext.save()
    
  

【问题讨论】:

你的学生变量需要@ObservedObject 才能动态更新。 【参考方案1】:

你只需要

struct StudentView: View 
  @Environment(\.managedObjectContext) var managedObjectContext

  @ObservedObject var student: Student     // << here !!

使用 Xcode 11.4 / ios 13.4 测试

【讨论】:

【参考方案2】:

您正在更改您的 CoreData 对象之一的属性。但是,这不会刷新视图,因为您仅在人员实例上使用来显示数据。您将需要刷新视图以显示更新。

只需使用虚拟@State,您将在更改后切换。

@State var updateView : Bool = false

您需要在视图中使用它,所以只需将其添加到某处:

  Text("\(student.firstName)" + (self.updateView ? "" : "").font(.headline).foregroundColor(Color.black)

然后切换它:

Button(action: 
    self.askQuestion()
    self.updateView.toggle()
) 
    Text("Ask question")

【讨论】:

以上是关于更新 CoreData 中的数据及其在视图中的值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SwiftUI 模态视图在此处更新父变量(附代码)

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

核心数据:如何显示 fetchrequest 的结果以计算表格视图单元格中的值

如何更改coredata中的记录顺序?

通过获取列表视图中特定列中的值和我的数据库中的值的总和来更新数据库

使用 Coredata 一起更新特定值(在所有表中通用)