0

这是我在这个论坛上的第一篇文章,真的希望有人能在这里帮助我。我将非常感谢任何帮助!

我正在使用 Swift UI(之前从未使用过 UIKit)编写我的第一个应用程序,我想稍后发布。

这也是我第一个实现 CoreData 的应用程序。

例如,我使用以下实体:

家庭,人

  • 1 人可拥有 1 个家庭
  • 1 家庭可以有很多人

我的应用程序结构如下:

内容视图:

包含一个 TabView,其中包含 2 个其他视图。一个设置视图和一个带有 LazyVGrid 的视图。

LazyVGrid 视图:

此视图显示每个家庭的 GridItem。我通过以下 Fetchrequest 获得家庭:

@Environment(\.managedObjectContext) private var viewContext
// These are the Families from the FetchRequest
@FetchRequest(entity: Family.entity(),
    sortDescriptors: [NSSortDescriptor(keyPath: \Family.created, ascending: false)]
) var families: FetchedResults<Family>

每个 GridItem 都通过 NavigationLink 链接到“FamilyDetailView”。所以我通过家庭如下:

NavigationLink(destination: FamilyDetailView(family: family).environment(\.managedObjectContext, self.viewContext), label: {Text("Family Name")

在 FamilyDetailView 中,我得到了带有属性包装器的 Family:

@State var family : Family

在这个 FamilyDetailView 中是我遇到的问题。

在这里,我还有一个 LazyVGrid,它为 GridItem 中的家庭中的每个人显示 1 个 NavigationLink。在这个 GridItem 中,我还展示了 Person 的“名称”。

当点击 NavigationLink 时,我会到达最后一个视图,即 PersonDetailView。此视图获取 Person,它也是与 Family 实体有关系的实体。

我通过它如下:

NavigationLink(
destination: PersonDetailView(person: person),
label: {Text("Person")})

在 PersonDetailView 中,我现在更改人名并将更改的内容保存到 CoreData。

保存更改没有问题,问题是当我返回时,使用 NavigationView 中的 topleading 后退按钮,视图没有更新。我必须重新启动应用程序才能看到更改..

我知道问题必须与传递数据有关,但我无法弄清楚我做错了什么。

我真的很感谢所有试图帮助我的人!

非常非常感谢你!!

4

2 回答 2

0

非常感谢,这对我帮助很大。FamilyDetail 视图正在使用该修复程序进行更新。只有一件事没有更新。我有一个“FamilyRowView”,它显示在我的 Family LazyVGrid 中的每个 GridItem。这现在也使用“@ObservedObject var family:Family”,但仍然没有更新。有什么想法吗?太感谢了!

家庭列表视图:

NavigationLink(destination: FamilyDetailView(family: family)
                                    .environment(\.managedObjectContext, self.viewContext),
               label: {**FamilyRowView**(family: family)
                                        .environment(\.managedObjectContext, self.viewContext)})

FamilyRowView:

struct FamilyRowView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @ObservedObject var family : Family
    
    var body: some View {

它似乎与其他不起作用的视图相同,但它不会更新视图..

于 2020-12-06T19:30:24.113 回答
0

CoreData 对象是引用类型,即类,符合ObservableObject协议,所以用 代替状态包装相应的属性ObservedObject,比如

@ObservedObject var family : Family
于 2020-12-06T19:09:38.700 回答