EDIT 添加了显示变量声明的源代码
我正在尝试初始化一个视图模型属性,它是一个@ObservedObject
@ObservedObject private var viewmodel : ExpenseListViewModel
我想使用一个重新建立视图的视图模型来初始化视图模型,该模型将接受ManagedObjectContext作为构造函数中的参数
由于viewmodel具有适当的包装器,因此也不允许将其创建为计算属性。
当我尝试在初始化中初始化存储库和视图模型时,会在初始化之前使用一个自我
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
private (set) var repo: Repository
@ObservedObject private var viewmodel : ExpenseListViewModel
init() {
//let repository = CoreDataRepository(Context: moc)
repo = CoreDataRepository(Context: self.moc)
self.viewmodel = .init(repository: repo)
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
答案 0 :(得分:2)
@Environment
在初始化调用阶段不可用,稍后注入。所以这是可能的解决方案:
struct ContentView: View {
@Environment(\.managedObjectContext) private var moc
var body: some View {
InternalContentView(context: moc) // context is ready in body
}
struct InternalContentView: View {
@ObservedObject private var viewmodel: ExpenseListViewModel
init(context: NSManagedObjectContext) {
self.viewmodel = .init(repository: CoreDataRepository(Context: context))
}
var body: some View {
Text(viewmodel.Expenses[0].Name ).onAppear(perform: viewmodel.getExpenses )
}
}
}