在SwiftUI中使用视图模型
为了清晰地分离关注点,我想将我的SwiftUI视图与视图模型一起使用。
我有两个视图,一个ListView
是DetailView
当点击任何列表项时第一个会推动后者的视图——一个经典的导航视图。
我viewModel
在 my 上定义DetailView
如下属性并将其标记为观察对象,以便在其任何已发布属性发生更改时更新视图:
struct DetailView: View {
@ObservedObject var viewModel: DetailViewModel
var body: some View {
Text(viewModel.text)
}
}
这种方法要求我在内部创建视图时将 a 传递viewModel
给's 初始化程序:DetailView
ListView
struct ListView: View {
let animals = ["", "", "", "", ""]
var body: some View {
List {
ForEach(animals, id: \.self) { animal in
NavigationLink(
destination: DetailView(viewModel: DetailViewModel(text: animal))
) {
Text(animal)
}
}
}
}
}
这里DetailViewModel
简单定义如下:
class DetailViewModel: ObservableObject {
@Published var text: String
}
(这里的视图模型肯定是过度设计的,但这只是为了解释问题。)
⚡️ 问题
由于每次body
更新列表视图时都会创建所有导航链接的目标视图,因此相应的视图模型也是如此。对于如上所示的简单视图模型,这不是什么大问题,但对于更复杂的现实世界视图模型,它肯定会成为问题。例如,视图模型可能会实例化其他初始化起来相当昂贵的类。这将在显示ListView
每个DetailView
(模型)时完成——无论它是否会被显示(需要)。
因此,在我看来,在其他视图的主体内创建视图模型是一种反模式。尽管如此,这是我在 Internet 上的代码示例和文章中看到的最常见的做法。
❓ 我的问题
有没有办法让SwiftUI视图NavigationLink
立即实例化 s 的目标视图?或者有没有办法为视图创建视图模型以用作视图之外的导航链接目标body
?