navigationview - SwiftUI - 多次创建 ObservableObject
问题描述
我在视图中创建了一个 ObservableObject。
@ObservedObject var selectionModel = FilterSelectionModel()
FilterSelectionModel
我在's函数中放置了一个断点init
,它被多次调用。因为这个 View 是 a 的一部分NavigationLink
,所以我知道它是在随后创建的,并且与它一起创建了 selectionModel。当我导航到视图时,将再次创建 selectionModel。
在同一个视图中,我有一个“子视图”,我将 selectionModel 作为一个传递,EnvironmentObject
以便子视图可以更改它。
AddFilterScreen().environmentObject(self.selectionModel)
当子视图被关闭时,selectionModel 再次被创建,对它所做的更改也消失了。
有趣的注意事项:在最顶层是一个NavigationView
. 如果我添加
.navigationViewStyle(StackNavigationViewStyle())
对此NavigationView
,我的 selectionModel 的更改消失了。但是,如果我不添加navigationStyle
,则在子视图中所做的 selectionModel 更改仍然存在!(但我不想要拆分导航视图,我想要堆叠导航视图)
在这两种情况下 - 无论有没有navigationStyle
, selectionModel 都会被创建多次。我无法理解这些应该如何可靠地工作。
解决方案
你可以在 init 方法中实例化 observable 对象,这样你就可以保持它的值或者值不会消失。
在视图文件中以这种方式实例化。
@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 方法,但我没有在这个问题上取得任何成功。
为了停止 ViewModel 的多次初始化,因为在 Navigation View 中声明了视图,并且 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() })
推荐阅读
- html - 如何在多个菜单之间添加空格
- c# - C#关闭mysql连接不起作用,mysqli_connect(): (08004/1040): 连接太多
- r - R连接到postgres在dbExistsTable中返回false,但它是错误的
- android - Paging 3.0 库不会停止从服务器获取项目
- apache-kafka - 无法通过 kafka-avro-console-consumer 读取 avro 消息(最终目标通过 spark 流读取它)
- java - GridFS 返回的文件不完整
- angular - 在 Angular 2+ 应用程序中下载文件
- javascript - 如何在Javascript中添加多个换行符
- flutter - 从对象列表创建副本并更改新列表而不更改原始的一颤
- tabs - 我刚刚在我的代码中添加了一个新区域,但是,它现在不允许我点击其中任何一个