【发布时间】:2021-11-18 15:01:18
【问题描述】:
看起来 Navigation + TabView + Sheet 在 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")
}
}
}
【问题讨论】:
-
这比我想象的要复杂!我尝试保存 NavigationLink 状态,保存 TabView 选择状态,并将工作表向上移动到 TabView 或 NavigationView 级别。运气不好!
-
这里也一样,并且没有真正的解决方法,即使下面的答案也可以,但是如果我们使用 fullScreenCover 或 sheet,navigationLink 会弹出到预览视图。
-
@skywalkerdude 你找到解决方案了吗?
标签: swiftui swiftui-navigationview ios15 swiftui-tabview