【发布时间】:2021-06-20 17:14:54
【问题描述】:
我是 MVVM 世界的新手,想知道在呈现新视图时设置新视图的 ViewModel 属性的最佳方法是什么?
我试图在呈现视图的 .fullScreenCover 中初始化 ViewModel 类,但这给我带来了各种各样的问题。这就是我所做的:
struct FirstView: View {
@State var isActive = false
var body: some View {
Text("Tap here to go to SecondView")
.onTapGesture {
isActive = true
}
.fullScreenCover(isPresented: $isActive, content: {
SecondView(viewModel: ViewModel(), isActive: $isActive)
})
}
}
struct SecondView: View {
@ObservedObject var viewModel: ViewModel
@Binding var isActive: Bool
init(viewModel: ViewModel, isActive: Binding<Bool>) {
self.viewModel = viewModel
self._isActive = isActive
}
var body: some View {
Button(action: {
$isActive = false
}, label: {
Text("Go back to FirstView")
})
}
}
问题是 viewModel 的 init 方法被多次调用。我不确定这是否是因为底层的 FirstView 正在被重绘,尽管它不再出现在屏幕上,或者它是否与在 SecondView 中访问的绑定 isActive var 有关。无论如何,正在创建如此多的视图模型。我不确定这是为什么。但更重要的是我想知道初始化新视图的 viewModel 的正确方法是什么。
我目前正在做的是在 FirstView 的 viewModel 中创建 SecondView 的 viewModel 并传递引用,但感觉很不对。
【问题讨论】:
-
不确定该链接是关于什么的。我不是在问命名约定。我使用上面的命名来说明问题。这些不是我代码中的名称。问题是关于如何传递视图模型。不是叫什么。谢谢。
-
你以为你在谈论一个“ViewModel”,但实际上里面有一个空间:它是一个“view model”,一个视图的模型。既然我们有像点这样的现代工具,那么“ViewModel”这个术语仍然存在是令人困惑的。请改变您对此的看法,帮助行业发展。
-
驼峰式表示空格。我相信这是惯例。我没有称它为视图模型