我在 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/