我在使用 Core Data
和 SwiftUI
时遇到了一些问题。
我的主视图可以访问核心数据
中实体的一些信息。
我想使用某种绑定(bind)将其传递给 subview ,以便它也可以访问该数据并可能更新它。
这是我尝试过的代码的一个版本。
在主视图侧:
@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,
......)
}
.....
}
在 subview 方面:
struct MyListView: View {
@Binding var localList: FetchedResults<MyEntity>
.....
}
在上面的代码中,@FetchRequest正在工作,获取了我期望的信息。但在那之后,我尝试将 @FetchRequest 的行为表现得像 @State 一样。但它不起作用。为我的 subview (即 MyListView)提供对 @FetchRequest 提供的数据的访问权限的正确方法是什么?
在写这篇文章之前,我在阅读一些教程时显然已经尝试过该代码的一些其他变体;但还是不行。
最佳答案
您无法修改 FetchedResults
,因为它是只读的,因此只需按原样传递即可
MyListView(localList: self.myList,
moc:self.managedObjectContext,
......)
和
struct MyListView: View {
var localList: FetchedResults<MyEntity>
.....
}
如果您希望 MyListView
的行为基于 FetchRequest
,则将其显式注入(inject)到主视图中,CoreData 会缓存获取的实体,因此没有缺点。
.... 您必须为此在工作 TableView 中显式传递上下文环境,例如 MyListView().environment(.managedObjectContext, self.managedObjectContext)
关于ios - 使用 Core Data(在 SwiftUI 中)提供的数据并与另一个 View 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63028547/