gpt4 book ai didi

navigationview - SwiftUI - ObservableObject 创建了多次

转载 作者:行者123 更新时间:2023-12-02 04:21:28 27 4
gpt4 key购买 nike

我在 View 中创建了一个 ObservableObject。

@ObservedObject var selectionModel = FilterSelectionModel()

我在 FilterSelectionModel 里面放了一个断点的 init函数,它被多次调用。因为这个 View 是 NavigationLink 的一部分,我知道它是在那时创建的,并且与它一起创建的是 selectionModel。当我导航到 View 时,将再次创建 selectionModel。

在同一个 View 中,我有一个“ subview ”,我在其中将 selectionModel 作为 EnvironmentObject 传递。所以 subview 可以改变它。
AddFilterScreen().environmentObject(self.selectionModel)

当 subview 被关闭时,selectionModel 将再次创建并且对它所做的更改也消失了。

有趣的提示:在最顶层是 NavigationView .如果我添加
.navigationViewStyle(StackNavigationViewStyle())

到此 NavigationView ,我的 selectionModel 的变化消失了。但是如果我 不要添加 navigationStyle ,selectionModel 在 subview 中所做的更改仍然存在!! (但我不想要拆分导航 View ,我想要堆叠的导航 View )

在这两种情况下 - 有或没有 navigationStyle , selectionModel 被创建多次。我无法理解这些应该如何可靠地工作。

最佳答案

您可以在 init 方法中实例化 observable 对象,这样您就可以保持其值,否则该值不会消失。

在 View 文件中以这种方式实例化。

@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 方法,并且我没有在此问题上取得任何成功。

为了在导航 View 中声明 View 时停止多次初始化 ViewModel,并且 SwiftUI 使用值类型的 struct,因此最终这些在 View 出现之前被初始化,因此您可以将该 View 转换为 LazyView,所以它只会在 View 即将呈现或显示时被初始化。
// 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() }) 

关于navigationview - SwiftUI - ObservableObject 创建了多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59533407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com