在 NavigationLink 之后,在 NavigationView 内、TabView 内显示 NavigationBar。 SwiftUI

Posted

技术标签:

【中文标题】在 NavigationLink 之后,在 NavigationView 内、TabView 内显示 NavigationBar。 SwiftUI【英文标题】:Displaying a NavigationBar, inside a NavigationView, inside a TabView, after a NavigationLink. SwiftUI 【发布时间】:2020-03-22 03:17:50 【问题描述】:

我正在制作一个用户需要登录的应用程序,然后将我带到一个 TabView,其中我有 3 个不同的视图(导航视图)。

问题是在我登录后,并使用 NavigationLink 将我发送到 TabView,向我显示 3 个不同的视图,其中我有 NavigationBarTitles;它还在我的之上创建了另一个(空)NavigationBarTitle。

已经尝试使用以下常用方法:在此单个视图中,删除 NavigationView 属性,因为它通常可以工作,但在这种情况下不行。

登录视图

import SwiftUI

struct LogInView: View 
    var body: some View 
        NavigationView 
            VStack 
                NavigationLink (destination: ContentView()) 
                    Text("Log In")
                        .foregroundColor(.white)
                        .padding(15)
                        .background(Color.blue)
                        .cornerRadius(10)
                
            .navigationBarTitle("Log In View")
        
    


struct LogInView_Previews: PreviewProvider 
    static var previews: some View 
        LogInView()
    

选项卡

import SwiftUI

struct ContentView: View 
    @State private var selection = 0

    var body: some View 
        TabView(selection: $selection)

            DetailView()
                .font(.title)
                .tabItem 
                    VStack 
                        Image("first")
                        Text("First")
                    
                
                .tag(0)

        .edgesIgnoringSafeArea(.top)
        .navigationBarBackButtonHidden(true)
        .navigationBarHidden(true)
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

详细视图

import SwiftUI

struct DetailView: View 
    var body: some View 
        NavigationView 
            List 
                Text("Hi")
                Text("Hi")
                Text("Hi")
            .navigationBarTitle("DetailView")
        
    


struct DetailView_Previews: PreviewProvider 
    static var previews: some View 
        DetailView()
    

This is how it looks

【问题讨论】:

【参考方案1】:

如果子视图的父视图(或其父视图的父视图)被包裹在一个 NavigationView 中,则不应将其包裹在 NavigationView 中。您只是在显示的照片上有两个NavigationViews,所以在 DetailView 中删除一个,它仍然会继承自 LogInView:

struct DetailView: View 
    var body: some View 
        List 
            Text("Hi")
            Text("Hi")
            Text("Hi")
        
        .navigationBarTitle("DetailView")
    

【讨论】:

我以前试过这个,但问题是我拿走了“空的 NavigationBarTitle”,但它也没有显示我的“DetailView NavigationBarTitle”。它又变空了,但是有了 NavigationBarTitleSpace。【参考方案2】:

您可以优化 ContentView 中的所有内容,而不是 detailView。虽然在你目前的工作中推理是好的,但演示背后的逻辑可能需要一些调整。

 struct ContentView: View 
@State private var selection = 0

var body: some View 
    TabView(selection: $selection)

        DetailView()
            .font(.title)
            .tabItem 
                VStack 
                    Image("first")
                    Text("First")
                
            
            .tag(0)

        .edgesIgnoringSafeArea(.top)
        .navigationBarBackButtonHidden(true).navigationBarTitle("DetailView", displayMode: .inline).navigationBarHidden(true)





struct DetailView: View 
var body: some View 
        List 
            Text("Hi")
            Text("Hi")
            Text("Hi")
        



【讨论】:

这里的逻辑是正确的,但问题是当我在“TabView”中添加多个“Detail View”时,我无法为每个“DetailView”更改 NavigationBarTitleText。 您可以为标题名称添加一个数组:navigationBarTitle(DetailViewNames[selection]), display: .inline)

以上是关于在 NavigationLink 之后,在 NavigationView 内、TabView 内显示 NavigationBar。 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个 NavigationLink 中有一个 NavigationLink

SwiftUI 在 NavigationLink 视图中隐藏 TabView 栏

如何在 SwiftUI 中为 NavigationLink 创建工厂方法?

在 NavigationLink 的嵌套 NavigationView 中列出核心数据对象的正确方法

SwiftUI 在 NavigationLink 中更改后退按钮的颜色

如何在 SwiftUI 列表中设置 NavigationLink