SwiftUI-TabView内部的OnExitCommand

时间:2020-06-20 22:24:55

标签: swift xcode swiftui tvos

我最近一直在尝试制作tvOS应用程序,但遇到了以下相当烦人的问题。我无法在TabView内使用导航功能,但是在移除菜单上仍然有菜单按钮将我带回到以前的状态。

struct TestView: View {
    
    @State var selection : Int = 0
    
    var body: some View {
        TabView(selection: self.$selection) {
            ExpView()
            .tabItem {
                HStack {
                    Image(systemName: "magnifyingglass")
                    Text("Explore")
                }
            }
            .tag(0)
        }
    }
}

struct ExpView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView(title: "Hey")) {
                Text("Detail")
            }
        }
    }
}

struct DetailView: View {
    var title : String
    var body: some View {
        VStack {
            Text(title)
        }
    }
}

我的问题是:是否可以在不完全关闭应用程序的情况下使菜单按钮返回到层次结构中的上一个视图?

2 个答案:

答案 0 :(得分:0)

您无需在Menu上调用dismiss,它会被NavigationLink自动调用(因此再调用一次dismiss会退出主菜单)

这是固定的视图。用Xcode 11.4测试过

struct ExploreView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView(title: "Hey")) {
                Text("Detail")
            }
        }
    }
}

struct DetailView: View {

    var title : String
    var body: some View {
        VStack {
            Text(title)
        }
    }
}

答案 1 :(得分:0)

因此,我找到了解决此问题的方法。 如果将navigationView放置在TabView之外,然后使用以下代码,则它将起作用:

struct TestView: View {
    
    @State var selection : Int = 0
    @State var hideNavigationBar : Bool
    
    var body: some View {
        NavigationView {
            TabView(selection: self.$selection) {
                ExpView(hideNavigationBar: self.$hideNavigationBar)
                .tabItem {
                    HStack {
                        Image(systemName: "magnifyingglass")
                        Text("Explore")
                    }
                }
                .tag(0)
            }
        }
    }
}

struct ExpView: View {
    
    @Binding var hideNavigationBar : Bool
    
    var body: some View {
        NavigationLink(destination: DetailView(title: "Hey")) {
            Text("Detail")
        }.navigationBarTitle("")
        .navigationBarHidden(self.hideNavigationBar)
        .onAppear {
            self.hideNavigationBar = true
        }
    }
}

struct DetailView: View {
    var title : String
    var body: some View {
        VStack {
            Text(title)
        }
    }
}