SwiftUI ObservableObject и @ObservedObject не сохраняют состояние

У меня такой код:

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 model.isMenuOpen @Published

1 ответ

В 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/

Другие вопросы по тегам