【发布时间】:2020-09-12 20:11:26
【问题描述】:
我有这种情况,我有一个包含一些常用元素的 BaseView 和一个包含一些常用功能的 BaseViewModel,但是当它的 @Published var 得到更新时,没有 BaseView 刷新发生。
设置是这样的:
class BaseViewModel: ObservableObject {
@Published var overlayView: AnyView = EmptyView().convertToAnyView()
func forceViewRefresh() {
self.objectWillChange.send()
}
func setOverlayView(overlayView: AnyView) {
self.overlayView = overlayView
}
}
这个视图模型子类BaseViewModel:
class FirstViewModel: BaseViewModel {
func showOverlayView() {
self.setOverlayView(overlayView: OverlayView().convertToAnyView())
}
}
我还有一个BaseView,我使用overlayView
struct BaseView<Content: View>: View {
let content: Content
@ObservedObject var viewModel = BaseViewModel()
init(content: () -> Content) {
self.content = content()
}
var body: some View {
ZStack {
Color.green.edgesIgnoringSafeArea(.vertical)
content
viewModel.overlayView
}
}
}
显示的第一个视图是 FirstView,它符合 BaseViewProtocol 并具有扩展 BaseViewModel 的 FirstViewModel。
struct FirstView: BaseViewProtocol {
@ObservedObject var viewModel = FirstViewModel()
var body: some View {
BaseView() {
Button("Show overlay") {
viewModel.showOverlayView()
}
}
}
}
单击First View 中的Show overlay 按钮会调用FirstViewModel 上的showOverlayView() 函数,后者又会调用BaseViewModel 上的setOverlayView。 BaseViewModel 中的 overlayView 的值按预期更改,但不会调用 FirstView 上的视图刷新。
我做错了什么?
非常感谢。
【问题讨论】:
-
您想通过使用
@Published var overlayView: AnyView = EmptyView().convertToAnyView()来达到什么目的?这不是 SwiftUI 应该如何工作的......请分享更多代码,以便我们为您提供更多帮助。 -
我在 BaseViewModel 中设置了一个覆盖视图,以便它可以由其视图模型子类 BaseViewModel 的任何其他视图显示在布局中。当发布的 var 从默认的空视图更改为另一个视图时,它应该触发视图刷新,但不会。我没有看到任何与 SwiftUI “工作方式”背道而驰的东西。 (顺便说一句,convertToAnyView 只是我写的一个小扩展,它基本上等同于 AnyView(overlayView))。
-
但是,我已经编辑了原始帖子,添加了更多细节以更好地关注问题。
标签: swiftui