【发布时间】:2021-04-20 17:37:52
【问题描述】:
为什么我将 TabView 放入 NavigationView 是因为当用户进入具有自己的底部操作栏的第二级“详细”视图时,我需要隐藏底部标签栏。
但是这样做会导致另一个问题:TabView 托管的所有第一级“列表”视图不再显示它们的标题。下面是一个示例代码:
import SwiftUI
enum Gender: String {
case female, male
}
let members: [Gender: [String]] = [
Gender.female: ["Emma", "Olivia", "Ava"], Gender.male: ["Liam", "Noah", "William"]
]
struct TabItem: View {
let image: String
let label: String
var body: some View {
VStack {
Image(systemName: image).imageScale(.large)
Text(label)
}
}
}
struct ContentView: View {
var body: some View {
NavigationView {
TabView {
ListView(gender: .female).tag(0).tabItem {
TabItem(image: "person.crop.circle", label: Gender.female.rawValue)
}
ListView(gender: .male).tag(1).tabItem {
TabItem(image: "person.crop.circle.fill", label: Gender.male.rawValue)
}
}
}
}
}
struct ListView: View {
let gender: Gender
var body: some View {
let names = members[gender]!
return List {
ForEach(0..<names.count, id: \.self) { index in
NavigationLink(destination: DetailView(name: names[index])) {
Text(names[index])
}
}
}.navigationBarTitle(Text(gender.rawValue), displayMode: .inline)
}
}
struct DetailView: View {
let name: String
var body: some View {
ZStack {
VStack {
Text("profile views")
}
VStack {
Spacer()
HStack {
Spacer()
TabItem(image: "pencil.circle", label: "Edit")
Spacer()
TabItem(image: "minus.circle", label: "Delete")
Spacer()
}
}
}
.navigationBarTitle(Text(name), displayMode: .inline)
}
}
我可以做的是在根视图中有一个 @State var title 并将绑定传递给所有列表视图,然后让这些列表视图将其标题设置回根视图出现。但我只是觉得不太对劲,有没有更好的方法呢?感谢您的帮助。
【问题讨论】:
-
我在here 中做了类似的事情,但是工作流中有一个 SwiftUI 内部崩溃。我观察到与您的代码快照相同的崩溃。请注意。
-
@Asperi,你是对的,模拟器在切换列表和关闭详细视图时会发出警告,但应用程序仍然存在并且正在运行。但是在真正的手机中它会崩溃..感谢您的提醒!你有没有想过如何摆脱这些错误?或任何动态隐藏选项卡视图的方法?
-
@Asperi,我猜标签视图阻碍了导航根视图及其子视图的连接,这就是为什么不能从子视图设置标题的原因,也是为什么子视图有无处可去。
-
提供了我的方法
标签: swiftui