【问题标题】:SwiftUI: How to pass NSManagedObjectContext into several viewmodelsSwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中
【发布时间】:2021-11-09 11:41:29
【问题描述】:

我正在尝试将我的核心数据视图上下文注入到多个视图模型中,因此我不需要在整个应用程序中传递一个大视图模型。

我使用的是 SwiftUI 生命周期,所以这里会生成 NSManagedObjectContext:

@main
struct Core_Data_VM_TestApp: App {
    let persistenceController = PersistenceController.shared

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

跟着@​​987654321@我没有成功,在与不同的初始化器一起玩之后也是如此。

我想要做的是这样的事情,它不起作用('不能在属性初始化器中使用实例成员'viewContext';属性初始化器在'self'可用之前运行')

内容视图

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @StateObject var itemVM = ItemViewModel(viewContext: viewContext)

(...)
    

视图模型:

class ItemViewModel: ObservableObject {
    
    var viewContext: NSManagedObjectContext
    
    init(viewContext: NSManagedObjectContext) {
        self.viewContext = viewContext
    }


}

感谢您的帮助!

【问题讨论】:

  • 在父视图中创建视图模型并注入它。

标签: swiftui


【解决方案1】:

只需从您的控制器中获取它。 ViewModel 中的变量看起来像

var viewContext: NSManagedObjectContext = PersistenceController.shared.container.viewContext

不需要在init中传递。

此外,作为最佳实践,如果有几个东西正在使用某个东西,你应该为那个东西创建一个对象并将公共代码放在那里。

所有的 ViewModel 都可以引用这个单一的对象。随着应用程序的增长,它将使更改和调试变得容易上百万倍。

【讨论】:

  • var viewContext: NSManagedObjectContext = PersistenceController.shared.container.viewContext 效果很好 - 谢谢你,同时也指出了关于引用单个对象的想法
【解决方案2】:

一种方法是不在声明中实例化@StateObject,而是在视图的init 方法中实例化。请注意,包装itemVM 属性的StateObject 结构存储为_itemVM

struct ContentView: View {
  @Environment(\.managedObjectContext) private var viewContext
  @StateObject var itemVM: ItemViewModel

  init() {
    _itemVM = StateObject(wrappedValue: ItemViewModel(viewContext: viewContext))
  }
  // ...
}

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多