navigationview - SwiftUI - ObservableObject 创建了多次

标签 navigationview swiftui observableobject

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

相关文章:

android - 如何在代码中更改 NavigationView 菜单中 MenuItems 的顺序?

swift - 如何在 SwiftUI 上使 LongPressGesture 失败

ios - SwiftUI:具有计算属性的 ObservableObject

java - 我想删除 NavigationView 布局上的栏

android - 导航 View 菜单项不响应任何单击

swiftui - 自 iOS 14 起在 swiftui 中使用导航栏项时如何修复列表奇怪的填充?

swift - 检查多个@Published 值

json - 将 JSON 数据存储到 CoreData

ios - 使用其他属性初始化 @Binding 时出现问题

SwiftUI 组合 : Nested Observed-Objects