使用 Core Data(在 SwiftUI 中)提供的数据并与另一个视图共享
Using data provided by Core Data (in SwiftUI) and sharing with another view
我在使用 Core Data
和 SwiftUI
时遇到了一些问题。
我的主视图可以访问 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)
我在使用 Core Data
和 SwiftUI
时遇到了一些问题。
我的主视图可以访问 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)