【问题标题】:How to hide TabView navigating from tabItem in childview in SwiftUI?如何在 SwiftUI 中隐藏从子视图中的 tabItem 导航的 TabView?
【发布时间】:2021-10-29 15:44:40
【问题描述】:

我在 swiftui 中使用 TabView。我想从 tabview tabItem 导航子视图。当我从 taview 导航到 childview 时,它在底部显示 tabview。这是图像.. 单击登录转到 Myview 页面。但是在Myview中,Tabview并没有隐藏

这是我的代码..

  1. 标签视图

        struct WelcomeView: View {
            var body: some View {
    
                TabView {
                    HomeView()
                        .tabItem {
    
                            Image("home_icon")
                            Text("Home")
                        }
    
                        .tag(0)
    
                    NotificationView()
                        .tabItem {
    
                            Image("notification_icon")
                            Text("Notification")
                        }.tag(1)
    
    
    
                    AccountView()
                        .tabItem {
    
                            Image("account_icon")
                            Text("Account")
                        }.tag(2)
    
                    SettingView()
                        .tabItem {
    
                            Image("settings_icon")
                            Text("Setting")
                        }.tag(3)
    
    
    
                 }
    
              }
           }
    
  2. 在 SettingView 选项卡项中:

         struct SettingView: View {
            @State private var isActive = false
    
            var body: some View {
                NavigationView {
                    VStack(alignment: .leading) {
    
                        VStack {
                            Button(action: {
                                isActive = true
                            }) {
                                Text("Login")
                            }
                            NavigationLink("", destination:  MyView(), isActive: $isActive)
    
                        }
                        }
    
                    }
                }
            }
    
  3. 我的视图:

       struct MyView: View {
            var body: some View {
    
                ZStack{
                    Text("Hello My View")
                }.navigationBarHidden(true)
                    .navigationBarTitleDisplayMode(.inline)
    
    
            }
        }
    

当我单击 SettingView tabItem 中的登录按钮时,它会转到 MyView 页面。但是在MyView页面tabview是不隐藏的。

如何在 MyView 页面中隐藏 tabview?

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    要隐藏标签,我们可以添加一个Bool 来处理是否显示视图。然后通过使用@Binding,我们可以将它传递给其他子视图,无论您在链中所做的任何更改都会影响所有视图。

    struct WelcomeView: View {
        @State var isTabViewShown = true
        var body: some View {
            TabView {
                if isTabViewShown {
                    HomeView()
                        .tabItem {
                            
                            Image(systemName: "house.fill")
                            Text("Home")
                        }
                    
                        .tag(0)
                    
                    NotificationView()
                        .tabItem {
                            
                            Image(systemName: "envelope.open.fill")
                            Text("Notification")
                        }.tag(1)
                    
                    
                    
                    AccountView()
                        .tabItem {
                            
                            Image(systemName: "person.crop.circle")
                            Text("Account")
                        }.tag(2)
                    
                    SettingView(isTabViewShown: $isTabViewShown)
                        .tabItem {
                            Image(systemName: "gearshape")
                            Text("Setting")
                        }.tag(3)
                }
            }
        }
    }
    
    struct MyView: View {
        @Binding var isTabViewShown: Bool
        var body: some View {
            
            ZStack{
                    Text("Hello My View")
            }
            .navigationBarHidden(false)
            .navigationBarTitleDisplayMode(.inline)
            .onAppear {
                isTabViewShown = false
            }
        }
    }
    
    struct SettingView: View {
        @State private var isActive = false
        @Binding var isTabViewShown: Bool
        var body: some View {
            NavigationView {
                VStack(alignment: .leading) {
                    VStack {
                        Button(action: {
                            isActive = true
                        }) {
                            Text("Login")
                        }
                        NavigationLink("", destination:  MyView(isTabViewShown: $isTabViewShown), isActive: $isActive)
                        
                        //Here is a button if you want to show it again
                        Button(action: {
                            isTabViewShown.toggle()
                            //You can also use this is you don't want to use a toggle
    //                        isTabViewShown = true
                        }) {
                            Text("Show again")
                        }
                    }
                }
            }
        }
    }
    
    struct HomeView: View {
        var body: some View {
            Text("Home View")
        }
    }
    
    struct NotificationView: View {
        var body: some View {
            Text("Notification View")
        }
    }
    
    struct AccountView: View {
        var body: some View {
            Text("Account View")
        }
    }
    

    【讨论】:

    • 我在 Xcode 13.2 和 iOS 15.2 上测试了这个精确的解决方案。不幸的是,只有选项卡项从视图中消失,但选项卡视图所占用的空间及其背景仍然存在。我不确定有什么解决方法可以解决这部分问题...
    • @Andre 我无法重现您遇到的问题。我将上面的代码复制到一个新项目中,新旧项目都在 15.2 中工作。您确定在标签视图内容周围包裹了bool 吗?删除您的代码链接,也许我可以提供帮助。
    猜你喜欢
    • 2020-08-15
    • 2020-09-10
    • 2020-05-09
    • 2022-09-30
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多