SwiftUI-ObservableObject创建多次

问题描述 投票:2回答:1

我已经在视图中创建了一个ObservableObject。

@ObservedObject var selectionModel = FilterSelectionModel()

我在FilterSelectionModelinit函数中放置一个断点,并且多次调用它。因为此View是NavigationLink的一部分,所以我知道它是在然后与selectionModel一起创建的。当我导航到视图时,会再次创建selectionModel。

在同一视图中,我有一个“子视图”,在其中我将selectionModel作为EnvironmentObject传递,因此子视图可以更改它。

AddFilterScreen().environmentObject(self.selectionModel)

关闭子视图时,将再次创建selectionModel,并且对其所做的更改也将消失。

有趣的注释:在最顶层是NavigationView。如果我添加

.navigationViewStyle(StackNavigationViewStyle())

对此NavigationView,我的selectionModel的更改消失了。但是如果我添加navigationStyle,则在子视图中对selectionModel所做的更改仍然保留! (但是我不想要分割的导航视图,我想要一个堆叠的导航视图)

[在两种情况下-带有或不带有navigationStyle,都会多次创建selectionModel。我无法确定应该如何可靠地工作。

navigationview swiftui-bug observableobject
1个回答
0
投票

您可以在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() }) 
© www.soinside.com 2019 - 2024. All rights reserved.