TabView 内的 NavigationView Swift UI
NavigationView inside a TabView Swift UI
经过长时间的休息后,我刚刚开始学习 SwiftUI,但我不明白为什么我不能将 Navigation View
放在 Tab View
中。
我希望我的 Navigation View
成为一个 .tabItem
,这样视图就会作为主要应用程序导航的一部分出现,所以我正在尝试这样做:
struct ContentView: View {
var body: some View {
TabView {
NavigationView {
.tabItem {
Text("Home")
}
Text("Tab bar test")
.navigationBarTitle("Page One")
}
}
这不适用于错误消息
Cannot infer contextual base in reference to member 'tabItem'
但是当我尝试这个时
var body: some View {
TabView {
NavigationView {
Text("Tab bar test")
.navigationBarTitle("Page One")
}
}
.tabItem {
Image(systemName: "1.circle")
Text("Home")
}
}
构建良好,但未显示标签栏。
我希望对其他人有用的主要问题是...
为什么我不能通过直接在 Navigation View
中嵌套 .tabItem
来制作一个 Navigation View
标签栏项目(按照我的第一个例子)?
我认为这是一个与 this one but there's no code there. And then quite similar to 类似的问题,但他们似乎正在使用 .tabItem
直接与 ContentView
就像我想与 NavigationView
一样,但事实并非如此建筑!?
我可能误解了一些简单的东西,但我现在完全不明白。
.tabItem
应该用作表示该选项卡的视图的修饰符。
在第一个示例中,由于语法错误,这不起作用——您试图在 NavigationView {
中的闭包打开时使用它,而您却想在外部使用它右括号的:NavigationView { }.tabItem(...)
在第二个示例中,您使用 .tabItem
作为修饰符 entire TabView
而不是 NavigationView
。
如果您缩进代码以便您可以看到层次结构,那么您的两个示例可能已经更清楚地揭示了正在发生的事情。尝试在 Xcode 中选择您的代码并使用 Ctrl-I 获取 Xcode 为您正确格式化它。
这是一个工作版本:
struct ContentView : View {
var body: some View {
TabView {
NavigationView {
Text("Tab bar test")
.navigationBarTitle("Page One")
}
.tabItem { //note how this is modifying `NavigationView`
Image(systemName: "1.circle")
Text("Home")
}
}
}
}
执行此操作以获得更好的概览:
内容视图:
struct ContentView : View {
var body: some View {
TabView {
FirstView()
.tabItem {
Image(systemName: "folder.fill")
Text("Home")
}
SecondView()
.tabItem {
Image(systemName: "folder.fill")
Text("SecondView")
}
}
}
}
第一视角
struct FirstView: View {
var body: some View {
NavigationView {
Text("FirstView")
.navigationBarTitle("Home")
}
}
}
}
第二视图
struct SecondView: View {
var body: some View {
NavigationView {
Text("SecondView")
.navigationBarTitle("Home")
}
}
}
}
经过长时间的休息后,我刚刚开始学习 SwiftUI,但我不明白为什么我不能将 Navigation View
放在 Tab View
中。
我希望我的 Navigation View
成为一个 .tabItem
,这样视图就会作为主要应用程序导航的一部分出现,所以我正在尝试这样做:
struct ContentView: View {
var body: some View {
TabView {
NavigationView {
.tabItem {
Text("Home")
}
Text("Tab bar test")
.navigationBarTitle("Page One")
}
}
这不适用于错误消息
Cannot infer contextual base in reference to member 'tabItem'
但是当我尝试这个时
var body: some View {
TabView {
NavigationView {
Text("Tab bar test")
.navigationBarTitle("Page One")
}
}
.tabItem {
Image(systemName: "1.circle")
Text("Home")
}
}
构建良好,但未显示标签栏。
我希望对其他人有用的主要问题是...
为什么我不能通过直接在 Navigation View
中嵌套 .tabItem
来制作一个 Navigation View
标签栏项目(按照我的第一个例子)?
我认为这是一个与 this one but there's no code there. And then quite similar to .tabItem
直接与 ContentView
就像我想与 NavigationView
一样,但事实并非如此建筑!?
我可能误解了一些简单的东西,但我现在完全不明白。
.tabItem
应该用作表示该选项卡的视图的修饰符。
在第一个示例中,由于语法错误,这不起作用——您试图在 NavigationView {
中的闭包打开时使用它,而您却想在外部使用它右括号的:NavigationView { }.tabItem(...)
在第二个示例中,您使用 .tabItem
作为修饰符 entire TabView
而不是 NavigationView
。
如果您缩进代码以便您可以看到层次结构,那么您的两个示例可能已经更清楚地揭示了正在发生的事情。尝试在 Xcode 中选择您的代码并使用 Ctrl-I 获取 Xcode 为您正确格式化它。
这是一个工作版本:
struct ContentView : View {
var body: some View {
TabView {
NavigationView {
Text("Tab bar test")
.navigationBarTitle("Page One")
}
.tabItem { //note how this is modifying `NavigationView`
Image(systemName: "1.circle")
Text("Home")
}
}
}
}
执行此操作以获得更好的概览:
内容视图:
struct ContentView : View {
var body: some View {
TabView {
FirstView()
.tabItem {
Image(systemName: "folder.fill")
Text("Home")
}
SecondView()
.tabItem {
Image(systemName: "folder.fill")
Text("SecondView")
}
}
}
}
第一视角
struct FirstView: View { var body: some View { NavigationView { Text("FirstView") .navigationBarTitle("Home") } } } }
第二视图
struct SecondView: View { var body: some View { NavigationView { Text("SecondView") .navigationBarTitle("Home") } } } }