【发布时间】:2021-05-07 10:56:32
【问题描述】:
我最近在SwiftUI和ObservedObject/ObservableObject遇到了以下问题:
如果 ObservedObject/ObservableObject 在视图中发布,则会重新计算 body 属性 - 正如预期的那样。
但是如果body 属性中有一个子视图,它也有一个ObservedObject,那么奇怪的是,视图不仅会重新计算子视图的body 属性,还会重新计算整个object。
ObservedObject 的状态当然是lost从子视图中。
当然,您可以通过.environmentObject() 将ObservableObject 添加到子视图中来防止这种情况发生,但我认为这不是最好的解决方案,尤其是对于更复杂的视图层次结构。
这里是一个示例代码:
struct ContentView: View {
@ObservedObject var contentViewModel: ContentViewModel = ContentViewModel()
var body: some View {
VStack {
Button {
self.contentViewModel.counter += 1
} label: {
Text(String(self.contentViewModel.counter))
}
SubView()
}
}
}
class ContentViewModel: ObservableObject {
@Published var counter: Int = 0
}
以及子视图:
struct SubView: View {
@ObservedObject var subViewModel: SubViewModel = SubViewModel()
var body: some View {
Button {
self.subViewModel.counter += 1
} label: {
Text(String(self.subViewModel.counter))
}
}
}
class SubViewModel: ObservableObject {
@Published var counter: Int = 0
}
这里是示例代码的外观/工作方式:
我意识到的最后一件奇怪的事情,只有当你使用 Observed Object 时才会出现这种情况。如果我将子视图中的@ObservedObject var subViewModel: SubViewModel = SubViewModel() 替换为@State var counter: Int = 0,它将再次正常工作并保留状态。
也许我错过了一些东西,但我真的很困惑。我非常感谢任何答案和解决方案。如果您还有其他问题可以发表评论,我会在 24 小时内回复(只要问题是开放的)。
【问题讨论】:
标签: swift swiftui observableobject observedobject