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

标签 ios swift core-data swiftui swiftui-list

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

我的主视图可以访问核心数据中实体的一些信息。

我想使用某种绑定(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/

相关文章:

ios - 在 Swift 3 中,如何在转换到另一个 SKView 时传递变量?

ios - 带有子实体的 NSFetchRequest - 在子实体内搜索

swift - 如何在 SpriteKit 中将一个 Action 应用于多个 Sprite?

ios - lazy var属性被初始化两次正常吗?

swift - 从 Swift 2 迁移到 Swift 3 : Initializer has different argument names from those required by protocol 期间的奇怪问题

iphone - 我什么时候想使用 NSPropertyMapping?

swift - 快速保存 NSManagedObjectContext 时出错

ios - 我如何在 UILabel/UITextView 中放置多点触摸,如 facebook 标题?

ios - isBatteryMonitoringEnabled 属性状态未变为 true

ios - 在 iOS 的后台线程中用同步请求替换异步请求?