看起来在iOS 15中,导航+选项卡视图+底部工作表存在问题。
当我这样做时: ContentView -> DetailView -> 底部工作表
当底部工作表出现时,Detail
视图会自动从堆栈中弹出:
https://www.youtube.com/watch?v=gguLptAx0l4
我希望Detail
视图即使在底部工作表出现时也保持不变。有人知道为什么会发生这种情况以及如何解决吗?
这是我的示例代码:
import Combine
import SwiftUI
import RealmSwift
struct ContentView: View {
var body: some View {
NavigationView {
TabView {
TabItemView(num: 1)
.tabItem {
Text("One")
}
TabItemView(num: 2)
.tabItem {
Text("Two")
}
}
}
}
}
struct TabItemView: View {
private let num: Int
init(num: Int) {
self.num = num
}
var body: some View {
NavigationLink(destination: DetailView(text: "Detail View \(num)")) {
Text("Go to Detail View")
}
}
}
struct DetailView: View {
@State private var showingSheet = false
private let text: String
init(text: String) {
self.text = text
}
var body: some View {
Button("Open Sheet") {
showingSheet.toggle()
}.sheet(isPresented: $showingSheet) {
Text("Sheet Text")
}
}
}
顺便说一下,这个在iOS 14上可以工作。
更新1:
尝试了@Sebastian的建议,将NavigationView
放在TabView
中。虽然这解决了导航栏问题,但它从根本上改变了行为(我不想在DetailView
中显示选项卡)。
还尝试了他使用Introspect的建议,在NavigationLink
目标上设置navigationController.hidesBottomBarWhenPushed = true
,但没有任何效果:
struct ContentView: View {
var body: some View {
TabView {
NavigationView {
TabItemView(num: 1)
}.tabItem {
Text("One")
}
NavigationView {
TabItemView(num: 2)
}.tabItem {
Text("Two")
}
}
}
}
struct TabItemView: View {
private let num: Int
init(num: Int) {
self.num = num
}
var body: some View {
NavigationLink(destination: DetailView(text: "Detail View \(num)").introspectNavigationController { navigationController in
navigationController.hidesBottomBarWhenPushed = true
}) {
Text("Go to Detail View")
}
}
}
struct DetailView: View {
@State private var showingSheet = false
private let text: String
init(text: String) {
self.text = text
}
var body: some View {
Button("Open Sheet") {
showingSheet.toggle()
}.sheet(isPresented: $showingSheet) {
Text("Sheet Text")
}
}
}