如何正确更新局部视图中的CoreData对象



我想要一个简单的应用程序,它有一个排序的项目列表。单击每个项目进入详细信息视图,单击另一个按钮将更新项目的字段,该字段应重新绘制原始列表。

列表视图由提供

import SwiftUI
import CoreData
struct ContentView: View {
@Environment(.managedObjectContext) var context 
@State private var itemName: String = ""
// get all data, sorted by date
@FetchRequest(
entity: Item.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: Item.lastEdited, ascending: true)]
) var allItems: FetchedResults<Item>

var body: some View {
NavigationView {
List {
ForEach (allItems) { item in
NavigationLink(destination: DetailView(item: item).environment(.managedObjectContext, self.context)) {
Text(item.name ?? "No name given")
} // nav link
}

}
}
}

详细视图由给出


import SwiftUI
import CoreData

struct DetailView: View {

@Environment(.managedObjectContext) var context
var item: FetchedResults<Item>.Element
var body: some View {
Button (action: {
self.updateDate(item: self.item)
}) {
Text("Press me!")
}
} // body
func updateDate(item: Item) {
item.lastEdited = Date()
} // func
} // DetailView

按下详细信息视图上的"Press Me"按钮会使更新工作,并更新列表视图,但当我按下按钮时会发生这种情况:

  1. 显示带有详细信息视图的新屏幕
  2. 返回到列表视图

为什么会发生(1(?我该如何避免这种情况?

我在xcdatamodeld 中将项目定义为实体

更改

var item: FetchedResults<Item>.Element

@ObservedObject var item: Item

发生这种情况的原因很可能是父对象正在重绘。

在DetailView中,您可以在其中进行更改。它将保存您所做的更改。

do {
try self.context.save()
} catch {
print(error)
}

最新更新