我有这样的代码:
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属性
答案 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/