使用 Core Data(在 SwiftUI 中)提供的数据并与另一个视图共享

Using data provided by Core Data (in SwiftUI) and sharing with another view

我在使用 Core DataSwiftUI 时遇到了一些问题。

我的主视图可以访问 Core Data 中实体的某些信息。

我想使用某种绑定将其传递给子视图,以便它也可以访问该数据并可能更新它。

这是我试过的代码的一个版本。

在主视图方面:

@Environment(\.managedObjectContext) var managedObjectContext
......
@FetchRequest(
    entity: MyEntity.entity(),
    sortDescriptors: [NSSortDescriptor(keyPath: \MyEntity.name, 
                                       ascending: true)]
) var myList: FetchedResults<MyEntity>

......

var body: some View {
    VStack {
      Button(action: {
      ..........
      }).sheet(isPresented: $showingList) {
        MyListView(localList: self.$myList,
                   moc:self.managedObjectContext,
                   ......)
    }
    .....
}

在子视图端:

struct MyListView: View {
    @Binding var localList: FetchedResults<MyEntity>
    .....
}

在上面的代码中,@FetchRequest 正在工作,获取我期望的信息。但在那之后,我试图做的就像@FetchRequest 表现得像@State 一样。它不起作用。让我的子视图(即 MyListView)访问@FetchRequest 提供的数据的正确方法是什么?

在编写此 post 之前,我显然已经尝试了此代码的其他一些变体,同时阅读了一些教程;但还是不行。

你不能修改FetchedResults,因为它是只读的,所以就按原样传递

MyListView(localList: self.myList,
           moc:self.managedObjectContext,
           ......)

struct MyListView: View {
    var localList: FetchedResults<MyEntity>
    .....
}

如果您希望 MyListView 的行为基于 FetchRequest,则将其注入其中,与您对主视图所做的类似,CoreData 缓存获取的实体,因此没有缺点。

..... 您必须为此明确地在 sheet 视图中传递上下文环境,例如 MyListView().environment(.managedObjectContext, self.managedObjectContext)