如何解决在SwiftUI中使用视图模型而无需分配开销 在 SwiftUI ⚡️问题❓我的问题
在 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 举报,一经查实,本站将立刻删除。