我已经在视图中创建了一个ObservableObject。
@ObservedObject var selectionModel = FilterSelectionModel()
我在FilterSelectionModel
的init
函数中放置一个断点,并且多次调用它。因为此View是NavigationLink
的一部分,所以我知道它是在然后与selectionModel一起创建的。当我导航到视图时,会再次创建selectionModel。
在同一视图中,我有一个“子视图”,在其中我将selectionModel作为EnvironmentObject
传递,因此子视图可以更改它。
AddFilterScreen().environmentObject(self.selectionModel)
关闭子视图时,将再次创建selectionModel,并且对其所做的更改也将消失。
有趣的注释:在最顶层是NavigationView
。如果我添加
.navigationViewStyle(StackNavigationViewStyle())
对此NavigationView
,我的selectionModel的更改消失了。但是如果我不添加navigationStyle
,则在子视图中对selectionModel所做的更改仍然保留! (但是我不想要分割的导航视图,我想要一个堆叠的导航视图)
[在两种情况下-带有或不带有navigationStyle
,都会多次创建selectionModel。我无法确定应该如何可靠地工作。
您可以在init方法中实例化可观察对象,这样您就可以保留其值,否则该值不会消失。
以这种方式在视图文件中实例化。
@ObservedObject var selectionModel : FilterSelectionModel
init() {
selectionModel = FilterSelectionModel(value : "value to be saved from disappearing")
}
以这种方式在viewModel文件中实例化。
class FilterSelectionModel : ObservableObject {
@Published var value : String
init(value : String) {
self.value = value
}
}
这是我发现的解决方法,但是仍然多次调用init方法,但在此问题上我没有获得任何成功。
为了停止视图模型的多次初始化,因为在导航视图中声明了视图,并且SwiftUI使用了一种值类型的struct,因此最终在视图出现之前对其进行了初始化,因此您可以将该视图转换为LazyView ,因此只有在视图将要显示或显示时才对其进行初始化。
// Use this to delay instantiation when using `NavigationLink`, etc...
struct LazyView<Content: View>: View {
var content: () -> Content
var body: some View {
self.content()
}
}
您可以这样称呼它...
NavigationLink(destination: LazyView { ViewTobePresented() })