问题描述
在 SwiftUI
中使用视图模型为了清晰地分离关注点,我想将 SwiftUI 视图用于视图模型。
我有两个视图,一个ListView
和一个DetailView
,在点击任何列表项时第一个将后者推入–经典的导航视图。
我在viewmodel
上定义了一个DetailView
属性,并将其标记为观察对象,以便在其任何已发布属性更改时更新视图:
struct DetailView: View {
@Observedobject var viewmodel: Detailviewmodel
var body: some View {
Text(viewmodel.text)
}
}
这种方法要求我在viewmodel
内创建视图时将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
的目标视图?还是有办法为视图创建视图模型,以用作视图body
之外的导航链接目标?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)