【问题标题】:Displaying a NavigationBar, inside a NavigationView, inside a TabView, after a NavigationLink. SwiftUI在 NavigationLink 之后,在 NavigationView 内、TabView 内显示 NavigationBar。 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

【问题讨论】:

    标签: swiftui navigationbar navigationview tabview navigationlink


    【解决方案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)
    猜你喜欢
    • 2020-05-22
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多