繁体   English   中英

SwiftUI - TabView 在首次加载时不隐藏 NavigationBar

[英]SwiftUI - TabView does not hide NavigationBar on first load

我有一个具有“两个根导航”结构的应用程序。 第一个视图(您可以认为是登录屏幕)包含指向其他可关闭的详细视图的导航链接。 其中一个导航链接指向一个 TabView,我想成为一个“新根”导航视图; 意思是,用户不应该能够查看后退按钮或滑动回到第一个视图。 此 TabView 本身具有导航链接,指向其他可关闭对象。

我在 TabView 上使用了.hideNavigationBar()修饰符来隐藏此视图上的导航,但是后退按钮仍然存在。 但是,如果我切换到另一个选项卡,转到一个详细信息,然后关闭该详细信息,TabBar 会突然尊重这个隐藏的导航栏。 下面粘贴了一个最小的工作示例:

struct BaseView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.gray
                VStack{
                    Text("Root Navigation View").padding()
                    NavigationLink(destination: RootTabNavView()) {
                        Text("To New Root View")
                    }.padding()
                    NavigationLink(destination: TestDetailView()) {
                        Text("To a detail view")
                    }.padding()
                }
            }
            .hideNavigationBar()
        }
    }
}

struct RootTabNavView: View {
    var body: some View {
        ZStack {
            TabView {
                TestTabView1()
                    .tabItem {
                        Text("1")
                    }
                TestTabView2()
                    .tabItem {
                        Text("2")
                    }
            }
        }
        .hideNavigationBar()
    }
}

struct TestTabView1: View {
    var body: some View {
        ZStack {
            Color.red
            Text("Test Tab View 1 (New Nav Root / Hidden Navigation)")
        }
        .hideNavigationBar()
    }
}

struct TestTabView2: View {
    var body: some View {
        ZStack {
            Color.green
            NavigationLink (destination: TestDetailView()) {
                Text("To a detail view")
            }
        }
        .hideNavigationBar()
    }
}

struct TestDetailView: View {
    var body: some View {
        ZStack {
            Color.purple
            Text("A Dismissable Detail")
        }
    }
}

struct BaseView_Previews: PreviewProvider {
    static var previews: some View {
        BaseView()
    }
}

当应用程序加载时,BaseView 会显示指向 TestDetailView 和 RootTabNavView 的链接。 当导航到 TestDetailView 时,我们会看到顶部的导航栏按预期显示,并且可以返回到 BaseView。 但是,当按下 RootTabNavView 的按钮时,导航选项卡仍然存在(让用户滑开选项卡视图)。 但是,如果我们切换到 Tab 2,转到详细视图,然后关闭该详细视图,则选项卡视图突然有一个隐藏的导航栏。

更有趣的是,如果我向RootTabNavView导航链接添加isDetailLink(false)修饰符,选项卡 1 有一个隐藏的导航栏,但是当我切换到选项卡 2 时它会重新出现,只有当我转到细节并关闭时,它才会再次隐藏。

这是 SwiftUI 中的错误吗? 我是否配置错误? .hideNavigationBar()isDetailLink()的行为方式我不知道吗?

TabView被设计为根视图,否则可能会表现得很奇怪 它还在开始时加载多个选项卡,因此每个用于相同目的的不同修饰符可能会发生冲突。

在这种情况下,更好的方法是将初始NavigationView替换为新的根视图 ( TabView ) 和转换(模仿导航)。

使用 Xcode 13.4 / iOS 15.5 测试

演示

这是主要部分:

ZStack {
    if showRoot {
        RootTabNavView()
            .transition(.move(edge: .trailing))
    } else {
        NavigationView {
            ZStack {
                Color.gray
                VStack{
                    Text("Root Navigation View").padding()
                    Button(action: { showRoot = true }) {
                        Text("To New Root View")
                    }.padding()
                    NavigationLink(destination: TestDetailView()) {
                        Text("To a detail view")
                    }.padding()
                }
            }
            .navigationTitle("")        // << hide !!
            .navigationBarHidden(true)  // << hide !!
        }
        .transition(.asymmetric(insertion: .identity, removal: .move(edge: .leading)))
    }
}.animation(.default, value: showRoot)

GitHub 上的测试模块

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM