我有一个自定义 TabBar 视图,它由 UIViewControllerRepresentables 的
Group
组成,当 TabRouter
状态发生相应变化时会呈现。
状态在
MenuView
中发生更改,它刚刚更改了 @Published
中保存 TabRouter
的内部
viewState
var
struct TabBarView: View {
@EnvironmentObject var router: TabRouter
var body: some View {
GeometryReader { geo in
VStack(alignment: .center, spacing: 0) {
Group {
switch router.viewState {
case .state1:
LegacyVCRepresentable1()
case .state2:
LegacyVCRepresentable2()
case .state3:
LegacyVCRepresentable3()
case .state4:
LegacyVCRepresentable4()
}
}
.frame(maxHeight: .infinity)
MenuView()
.frame(width: geo.size.width, height: geo.size.height/12)
}
}
.ignoresSafeArea(edges: .top)
}
}
我的问题是,我在这个 SwiftUI 视图中呈现的那些遗留 ViewController 是它们是故事板,并且每个都有不同的 Segue,可以在每个 ViewController 内的导航堆栈中更深入地导航(UINavigationController 转换)。
当视图导航得更深时,我是否可以得到某种回调,这样我就可以在不应该看到的时候隐藏
MenuView
?
或者我必须传递某种回调变量,例如:
case .state1:
LegacyVCRepresentable1(onNavigated: onNavigated)
func onNavigated() {
self.hidesMenuView = true
}
并且我自己处理所有这些部分?也许有人遇到过类似的问题并有更优雅的解决方案?
提前致谢!
// Define a protocol for your representable view controllers
protocol NavigatableRepresentable {
var onNavigate: (() -> Void)? { get set }
}
// Extend each representable to conform to the protocol
extension LegacyVCRepresentable1: NavigatableRepresentable { /* Implementation */ }
// Repeat for other representables...
// Use in your TabBarView
struct TabBarView: View {
@EnvironmentObject var router: TabRouter
@State private var hidesMenuView = false
var body: some View {
GeometryReader { geo in
VStack(alignment: .center, spacing: 0) {
Group {
switch router.viewState {
case .state1:
LegacyVCRepresentable1(onNavigate: { self.hidesMenuView = true })
// Repeat for other states...
}
}
.frame(maxHeight: .infinity)
if !hidesMenuView {
MenuView()
.frame(width: geo.size.width, height: geo.size.height/12)
}
}
}
.ignoresSafeArea(edges: .top)
}
func onNavigated() {
hidesMenuView = true
}
}
这种方法将导航处理逻辑封装在每个可表示中,使 TabBarView 更干净,更专注于布局而不是导航逻辑。此外,通过使用协议,您可以为所有可表示对象创建一个通用接口,这可以帮助保持代码库的一致性和可维护性