SwiftUI ObservableObject和@ObservedObject不保持状态

时间:2019-11-25 21:35:08

标签: swiftui observedobject observableobject

我有这样的代码:

struct MenuView : View {

    @Environment(\.verticalSizeClass) var sizeClass
    @EnvironmentObject var model : MenuModel

    @ObservedObject var items = MenuItems()

    var body: some View { 

    }

}

我考虑为什么ObservableObject不保持其状态(此对象没有一个实例),而是在每次其他视图更改时在每次重绘时都重新创建(调用init()方法)。我认为每个对象一次。

但是,点击按钮会导致重新创建View以及此ObservedObject。 我是否应该通过属性初始化而不是通过父项创建它,并将其传递给构造函数?

如何正确将@ObservedObject传递给子视图?我考虑将其传递给@Bindable属性,但是它不起作用。

我正在通过 Button 模型进行更改。isMenuOpen @Published属性

1 个答案:

答案 0 :(得分:2)

SwiftUI在还原视图状态(是@State@ObservedObject)时有一些“魔术”。这些状态由SwiftUI管理,并在调用body之前恢复。

您的子视图可以进行初始化,但是请注意,它必须像这样:

init(foo: Foo) {
    self._foo = ObservedObject(initialValue: foo)
}

您可能还希望扩展视图Equatable,以帮助进行区分。

我在这里写了关于状态的古怪事物的更多内容:https://samwize.com/2020/04/30/a-few-things-about-state/