我做错了什么?当CoreData对象更新时,我的UI应该会刷新



我正在开发SwiftUI,使用CoreData,我有Group.entity,它可以有很多Items.entity。

单击组导航到所述组中的项目列表。你点击星星来切换它的填充,就像用一个";收藏夹">

然而,我的系统可以100%工作,以查看我需要的更改,以便来回导航。

根据我的研究,CoreData对象就像可观察对象一样工作,FetchRequest是实时的,因为它们告诉视图数据已经发生了变化,是时候刷新LIST或FOREACH了。

struct ContentView: View {
@Environment(.managedObjectContext) var moc
@FetchRequest(entity: Group.entity(), sortDescriptors: [])
var groups: FetchedResults<Group>
@FetchRequest(entity: Item.entity(), sortDescriptors: [])
var items: FetchedResults<Item>
var body: some View {
NavigationView {
VStack {
AddDummyDataButton()
List {
ForEach(groups, id: .self) { group in
NavigationLink(destination: GroupDetail(group: group)) {
Text(group.wrappedName)
}
}.onDelete { IndexSet in
let deleteItem = self.groups[IndexSet.first!]
self.moc.delete(deleteItem)
try? self.moc.save()
}
}
}
}
}
}
struct GroupDetail: View {
@Environment(.managedObjectContext) var moc
@FetchRequest(entity: Group.entity(), sortDescriptors: [])
var groups: FetchedResults<Group>
@FetchRequest(entity: Item.entity(), sortDescriptors: [])
var itemsFetchedggr: FetchedResults<Item>
var group: Group
var body: some View {
List {
ForEach(self.group.itemsArray, id: .self) { item in
HStack {
Text(item.wrappedName)
Image(systemName: item.isFave ? "star.fill" : "star")
.foregroundColor(.yellow)
.onTapGesture {
item.isFave.toggle()
try? self.moc.save()
}
}
}
}
}
}

所以-将Item放入ItemRow的新结构中-我想这无论如何都是最佳实践,并使用for each返回传入Item的ItemRow。

这与地标教程var item: Item非常相似

然而,我们也需要做到:

@ObservedObject var item: Item.

我想这就是swiftUI和CoreData的合作方式,我花了很长时间才找到解决方案,所以我想这将在未来对某人有所帮助以下的完整代码

import SwiftUI
import CoreData
struct ContentView: View {
@Environment(.managedObjectContext) var moc
@FetchRequest(entity: Group.entity(), sortDescriptors: [])
var groups: FetchedResults<Group>
var body: some View {
NavigationView {
VStack {
AddDummyDataButton()
List {
ForEach(groups, id: .self) { group in
NavigationLink(destination: GroupDetail(group: 
group)) {
Text(group.wrappedName)
}
}.onDelete { IndexSet in
let deleteItem = self.groups[IndexSet.first!]
self.moc.delete(deleteItem)
try? self.moc.save()
}
}
}
}
}
}
struct GroupDetail: View {
@Environment(.managedObjectContext) var moc
var group: Group
var body: some View {
List {
ForEach(self.group.itemsArray, id: .self) { item in
ItemRow(item: item)
}
}
}
}
struct ItemRow: View {
@Environment(.managedObjectContext) var moc
@ObservedObject var item: Item
var body: some View {
HStack {
Text(item.wrappedName)
Image(systemName: self.item.isFave ? "star.fill" : "star")
.foregroundColor(.yellow)
.onTapGesture {
self.item.isFave.toggle()
try? self.moc.save()
}
}
}
}

最新更新