在下面的示例中,当我3rd View
从 TabView 导航到然后单击 Button 以呈现工作表时,工作表被呈现但3rd View
被弹出。不确定为什么要重新调用 TabView 主体。我尝试过以下事情:
- 有一个单独的 State 属性将其与 Navigation Link 绑定。
- 创建一个 StateObject 并在其中包含一个属性以与 Navigation Link 绑定。
- 直接使用不使用 isActive 参数的 Navigation Link。
struct TestView: View {
@State var selectedTab: TabType = .home
var body: some View {
NavigationView {
TabView(selection: $selectedTab) {
ForEach(TabType.allCases, id: \.self) { tabType in
switch tabType {
case .profile:
ThirdView()
.navigationBarHidden(selectedTab == .profile)
.tag(tabType)
.tabItem {
Label(tabType.title, systemImage: "plus")
}
default:
SecondView()
.tag(tabType)
.tabItem {
Label(tabType.title, systemImage: "star")
}
}
}
}
}
}}
struct SecondView: View {
var body: some View {
VStack {
Spacer()
Text("2nd view")
NavigationLink("3rd view", destination: ThirdView())
Spacer()
}
.background(Color.green)
}
}
struct ThirdView: View {
@State var presentSheet = false
var body: some View {
ZStack {
Color.gray
VStack {
Text("3rd view")
Spacer()
Button("Button") {
presentSheet = true
}
.padding()
}
}
.sheet(isPresented: $presentSheet) {
VStack {
Spacer()
Text("This is sheet")
Spacer()
}
}
}
}
enum TabType: CaseIterable {
case home
case discover
case profile
case more
var image: Image {
switch self {
case .home:
return Image(systemName: "plus")
case .discover:
return Image(systemName: "plus")
case .profile:
return Image(systemName: "plus")
case .more:
return Image(systemName: "plus")
}
}
var title: LocalizedStringKey {
switch self {
case .home:
return LocalizedStringKey("home")
case .discover:
return LocalizedStringKey("Discover")
case .profile:
return LocalizedStringKey("Me")
case .more:
return LocalizedStringKey("Shop")
}
}
}