由于NavigationLink层次结构,SwiftUI TabView无法工作

ie3xauqp  于 12个月前  发布在  Swift
关注(0)|答案(1)|浏览(93)

我有一个带有三个视图的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
}
xriantvc

xriantvc1#

简短的回答:把你的NavigationStacks(或NavigationViews)放在单个选项卡的内部,而不是外部。
详细回答:导航模式是一个复杂的主题。有很多内容,我建议从Apple WWDC开始讨论这个问题。您当前的根视图是标签视图,而不是返回到的特定标签,因此这就是导航所“返回”的内容。

相关问题