【发布时间】:2022-02-12 07:10:10
【问题描述】:
我正在尝试简化项目中的 ContentView,但我正在努力了解如何将基于 @State 的逻辑移动到其自己的文件中并使 ContentView 适应任何更改。目前,我有基于@Binding 操作显示自己的动态视图,我将 $binding 向下传递到视图层次结构以使按钮切换布尔值。
这是我目前的尝试。我不确定如何在 SwiftUI 中从嵌套视图更改 SheetPresenter 的视图状态,而无需将 $binding 一直传递到视图堆栈。理想情况下,我希望它看起来像 ContentView.overlay(sheetPresenter($isOpen, $present)。
另外,我正在学习 SwiftUI,所以如果这不是最好的方法,请提供指导。
class SheetPresenter: ObservableObject {
@Published var present: Present = .none
@State var isOpen: Bool = false
enum Present {
case none, login, register
}
@ViewBuilder
func makeView(with presenter: Present) -> some View {
switch presenter {
case .none:
EmptyView()
case .login:
BottomSheetView(isOpen: $isOpen, maxHeight: UIConfig.Utils.screenHeight * 0.75) {
LoginScreen()
}
case .register:
BottomSheetView(isOpen: $isOpen, maxHeight: UIConfig.Utils.screenHeight * 0.75) {
RegisterScreen()
}
}
}
}
【问题讨论】:
-
如果您不想在视图中一直传递 $binding,您可以在顶视图中创建一个 StateObject 变量并使用 .environmentObject() 传递它。并使用 EnvironmentObject 从任何视图访问它