iOS SwiftUI 自定义选项卡栏视图在 UIViewControllerRepresentable 之间导航时隐藏

问题描述 投票:0回答:1

我有一个自定义 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
}

并且我自己处理所有这些部分?也许有人遇到过类似的问题并有更优雅的解决方案?

提前致谢!

ios xcode swiftui uikit storyboard
1个回答
0
投票
// 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 更干净,更专注于布局而不是导航逻辑。此外,通过使用协议,您可以为所有可表示对象创建一个通用接口,这可以帮助保持代码库的一致性和可维护性

© www.soinside.com 2019 - 2024. All rights reserved.