在 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
中。您只是在显示的照片上有两个NavigationView
s,所以在 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 中列出核心数据对象的正确方法