在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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...