我无法在 SwiftUI 中将 NavigationItemTitle 覆盖到 TabView
I am not able to overwrite NavigationItemTitle into TabView in SwiftUI
我是 SwiftUI 新手。我有一个 ContentView,因为我添加了 NavigationView,它从那个 NavigationView 重定向到另一个有 TabView 的视图。
//ContentView.swift
struct ContentView: View {
@State private var isValidLogin : Bool = false
var body: some View {
NavigationView{
VStack
{
NavigationLink(destination: HomePage(), isActive:$isValidLogin) {
Text("LOGIN")
.font(.headline)
.foregroundColor(.white)
.padding()
.onTapGesture {
self.isValidLogin = true
}
}
}.padding()
}
}
}
这里是 HomePage.swift
的代码
import SwiftUI
struct HomePage: View {
private enum Tab: Hashable {
case home
case map
}
@State private var selectedTabbar : Tab = .home
var body: some View {
TabView(selection: $selectedTabbar)
{
HomeView()
.tag(0)
.tabItem{
Text("Home")
Image(systemName: "house.fill")
}
MapView()
.tag(1)
.tabItem {
Text("Map")
Image(systemName: "map")
}
}.navigationBarTitle("Settings")
}
}
struct HomePage_Previews: PreviewProvider {
static var previews: some View {
HomePage()
}
}
这里 MapView.swift 的代码在这里
import SwiftUI
struct MapView: View {
var body: some View {
Text("You are in Map Page")
.navigationBarTitle(Text("Map"), displayMode: .inline)
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
我的错误是:当我将全局标题设置为 TabView 时 属性 .navigationBarTitle("Settings") 总是反映。但是我希望这样,如果我将 NavigationTitle 设置为 child 视图,那么它将显示在该 child 视图中。当我们点击 Map Item 时 NavigationTitle 应该 Map 时,我需要这样。当我们将导航标题应用到 child.
时,我无法找到为什么它不起作用的错误
不胜感激。提前致谢。
我找到了解决方案。
这里我改了我的HomePage
:
struct HomePage: View {
@State private var selectedTabbar = 0
var body: some View {
TabView(selection: $selectedTabbar)
{
HomeView()
.tag(0)
.tabItem{
Text("Home")
Image(systemName: "house.fill")
}
MapView()
.tag(1)
.tabItem {
Text("Map")
Image(systemName: "map")
} Image(systemName: "gear")
}
}.navigationBarTitle(Text(navigationBarTitle))
.navigationBarBackButtonHidden(true)
.accentColor(.red)
}
}
并且我为 HomePage
添加了一个扩展。它正在设置 child 视图的导航标题:
private extension HomePage {
var navigationBarTitle: String {
selectedTabbar == 0 ? "Home" : "Map"
}
}
使用此扩展我们可以将动态导航标题设置为 TabView
。
我是 SwiftUI 新手。我有一个 ContentView,因为我添加了 NavigationView,它从那个 NavigationView 重定向到另一个有 TabView 的视图。
//ContentView.swift
struct ContentView: View {
@State private var isValidLogin : Bool = false
var body: some View {
NavigationView{
VStack
{
NavigationLink(destination: HomePage(), isActive:$isValidLogin) {
Text("LOGIN")
.font(.headline)
.foregroundColor(.white)
.padding()
.onTapGesture {
self.isValidLogin = true
}
}
}.padding()
}
}
}
这里是 HomePage.swift
的代码import SwiftUI
struct HomePage: View {
private enum Tab: Hashable {
case home
case map
}
@State private var selectedTabbar : Tab = .home
var body: some View {
TabView(selection: $selectedTabbar)
{
HomeView()
.tag(0)
.tabItem{
Text("Home")
Image(systemName: "house.fill")
}
MapView()
.tag(1)
.tabItem {
Text("Map")
Image(systemName: "map")
}
}.navigationBarTitle("Settings")
}
}
struct HomePage_Previews: PreviewProvider {
static var previews: some View {
HomePage()
}
}
这里 MapView.swift 的代码在这里
import SwiftUI
struct MapView: View {
var body: some View {
Text("You are in Map Page")
.navigationBarTitle(Text("Map"), displayMode: .inline)
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
我的错误是:当我将全局标题设置为 TabView 时 属性 .navigationBarTitle("Settings") 总是反映。但是我希望这样,如果我将 NavigationTitle 设置为 child 视图,那么它将显示在该 child 视图中。当我们点击 Map Item 时 NavigationTitle 应该 Map 时,我需要这样。当我们将导航标题应用到 child.
时,我无法找到为什么它不起作用的错误不胜感激。提前致谢。
我找到了解决方案。
这里我改了我的HomePage
:
struct HomePage: View {
@State private var selectedTabbar = 0
var body: some View {
TabView(selection: $selectedTabbar)
{
HomeView()
.tag(0)
.tabItem{
Text("Home")
Image(systemName: "house.fill")
}
MapView()
.tag(1)
.tabItem {
Text("Map")
Image(systemName: "map")
} Image(systemName: "gear")
}
}.navigationBarTitle(Text(navigationBarTitle))
.navigationBarBackButtonHidden(true)
.accentColor(.red)
}
}
并且我为 HomePage
添加了一个扩展。它正在设置 child 视图的导航标题:
private extension HomePage {
var navigationBarTitle: String {
selectedTabbar == 0 ? "Home" : "Map"
}
}
使用此扩展我们可以将动态导航标题设置为 TabView
。