SwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中

Posted

技术标签:

【中文标题】SwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中【英文标题】:SwiftUI: How to pass NSManagedObjectContext into several viewmodels 【发布时间】: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
    




感谢您的帮助!

【问题讨论】:

在父视图中创建视图模型并注入它。 【参考方案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))
  
  // ...

【讨论】:

以上是关于SwiftUI:如何将 NSManagedObjectContext 传递到多个视图模型中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 swiftUI 按钮连接到 NSView 操作?

如何将 UISearchController 与 SwiftUI 集成

如何指定将保存 SwiftUI 自定义视图的数组的类型信息

SwiftUI - 如何将当前的强调色传递给工作表?

如何将字典项分别添加到 SwiftUI 列表中

如何将我的自定义 ButtonStyle 添加到 swiftui3 中的快捷方式 swiftui .buttonstyle() 属性