SwiftUI
我最近在ObservedObject
/中遇到了以下问题ObservableObject
:
如果ObservedObject
/ObservableObject
在视图中发布,body
则按预期重新计算属性。
但是如果body
属性中有一个子 View 也有一个ObservedObject
,那么奇怪的是,这个 View 不仅重新计算body
了子 View 的属性,而且重新计算了整个object
.
的状态当然ObservedObject
会从子视图中丢失。
当然,您可以通过添加ObservableObject
到子视图来防止这种情况.environmentObject()
,但我认为这不是最好的解决方案,尤其是对于更复杂的视图层次结构。
这是一个示例代码:
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 小时内回复(只要问题是开放的)。