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 传递到多个视图模型中的主要内容,如果未能解决你的问题,请参考以下文章
如何将 UISearchController 与 SwiftUI 集成
如何将我的自定义 ButtonStyle 添加到 swiftui3 中的快捷方式 swiftui .buttonstyle() 属性