我有一个带有三个视图的TabView,这三个视图是启动应用程序时的主要视图。在某些视图中,我有NavigationLinks来打开DetailViews。当这些被关闭时,用户将返回到用户在打开NavigationLink之前最初所在的TabView中的视图。然而,从那时起,以编程方式设置TabView的选择变量就不起作用了。我有三个自定义按钮来作为替代左右滑动。
当按钮被按下时,TabView索引指示器会发生变化,所以我假设TabView已经在绑定变量中注册了变化,但是View不会发生变化。
在我的NavigationView上,我使用了一个自定义的后退按钮,这似乎是问题所在。当使用.navigationBarBackButtonHidden(true)
时,问题发生了。否则它工作正常。
如何在使用自定义后退按钮时解决此问题?
struct MainView: View {
@StateObject var viewRouter: ViewRouter = ViewRouter()
var body: some View {
VStack(spacing: 0) {
NavigationView {
TabView(selection: $viewRouter.currentView) {
Text("Leaderboard")
.tag(Views.leaderboard)
Text("Home")
.tag(Views.home)
PouleView()
.tag(Views.poules)
}
.tabViewStyle(.page(indexDisplayMode: .always))
.ignoresSafeArea()
}
.navigationViewStyle(StackNavigationViewStyle())
VStack {
HStack(alignment: .center, spacing: 30) {
Text("Leaderboard")
.foregroundColor(.black)
.onTapGesture {
viewRouter.changeView(destination: Views.leaderboard)
}
Text("Home")
.foregroundColor(.black)
.onTapGesture {
viewRouter.changeView(destination: Views.home)
}
Text("Poule")
.foregroundColor(.black)
.onTapGesture {
viewRouter.changeView(destination: Views.poules)
}
}
}
.frame(maxWidth: .infinity)
}
}
}
struct PouleView: View {
@State var navigateToDetailView: Bool = false
var body: some View {
VStack(spacing: 0) {
NavigationLink(destination: PouleDetailView() , isActive: $navigateToDetailView) { EmptyView() }
Button(action: {
self.navigateToDetailView = true
}) {
Text("Open Detail")
}
}
}
}
struct PouleDetailView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
VStack {
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Close")
}
Text("This is content")
}
.navigationBarTitle("",displayMode: .inline)
.navigationBarBackButtonHidden(true)
.navigationBarHidden(true)
}
}
class ViewRouter: ObservableObject {
@Published var onboarding: Bool = false
@Published var currentView: Views = .home
@Published var originView: Views = .home
func changeView(destination: Views) {
withAnimation() {
self.originView = self.currentView
self.currentView = destination
}
}
}
enum Views: Equatable, Hashable {
case home
case poules
case leaderboard
}
1条答案
按热度按时间xriantvc1#
简短的回答:把你的NavigationStacks(或NavigationViews)放在单个选项卡的内部,而不是外部。
详细回答:导航模式是一个复杂的主题。有很多内容,我建议从Apple WWDC开始讨论这个问题。您当前的根视图是标签视图,而不是返回到的特定标签,因此这就是导航所“返回”的内容。