仅在第一页上隐藏导航栏 - Swift UI

Mus*_*ooq 4 ios13 swiftui

我的应用程序在 Swift UI 上运行,我的主页是Home(),在主页中有NavigationViewNavigationLink(destination: SaveThePlanet()),我在主页“主页”上隐藏了导航视图,它也隐藏在SaveThePlanet(). 如何取消隐藏SaveThePlanet()页面中的导航返回按钮?

import SwiftUI

struct Home: View {

    @State var show = false
    @State var showSaveThePlanet = false
    var body: some View {
        NavigationView {
            ZStack {
                Color.gray
                ContentView()
                    .blur(radius: show ? 10 : 0)
                    .scaleEffect(show ? 0.90 : 1)
                    .blur(radius: showSaveThePlanet ? 10 : 0)
                    .scaleEffect(showSaveThePlanet ? 0.90 : 1)
                    .animation(.default)

                leftIcon(show: $show)
                    .offset(x: 0, y: showSaveThePlanet ? 300 : 70)
                    .scaleEffect(show ? 0.90 : 1)
                    .blur(radius: show ? 10 : 0)
                    .animation(.easeInOut)

                SaveThePlanet()
                    .background(Color("Bg"))
                    .cornerRadius(10)
                    .shadow(color: Color("Green-Sh"), radius: 10, x: 0, y: 0)
                    .animation(.spring())
                    .offset(y: showSaveThePlanet ? 120 : UIScreen.main.bounds.height)
                    .padding()

                rightIcon(show: $showSaveThePlanet)
                    .offset(x: 0, y: 70)
                    .animation(.easeInOut)
                    .scaleEffect(show ? 0.90 : 1)
                    .blur(radius: show ? 10 : 0)
                    .opacity(showSaveThePlanet ? 0 : 1)


                rightIconClose(show: $showSaveThePlanet)
                    .offset(x: 0, y: 70)
                    .animation(.easeInOut)
                    .scaleEffect(show ? 0.90 : 1)
                    .blur(radius: show ? 10 : 0)
                    .opacity(showSaveThePlanet ? 1 : 0)

                MenuView(show: $show)
            }
            .edgesIgnoringSafeArea(.all)
            .navigationBarTitle("Home")
            .navigationBarHidden(true)
            .navigationBarBackButtonHidden(false)

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*ith 9

什么对我有用:@State在你的第一个视图上有一个属性,它决定你是否可以显示导航栏。然后通过 将该属性传递给所有后续视图@Binding,以便它是导航栏是否应显示的“单一事实来源”。

@State private var navBarHidden = false
Run Code Online (Sandbox Code Playgroud)

然后在您的主视图上,为该属性引用该navBarHidden属性,并设置标题。还要添加一个 onAppear 闭包,它会在这个视图重新出现时设置隐藏属性,即如果我们从详细视图中弹出这里。

var body: some View {
    NavigationView {
        NavigationLink(
            destination: DetailView(navBarHidden: self.$navBarHidden)
        ) {
            Text("Go to detail view")
        }
    }
    .navigationBarTitle("")
    .navigationBarHidden(self.navBarHidden)
    .onAppear(perform: {
        self.navBarHidden = true
    })
}
Run Code Online (Sandbox Code Playgroud)

然后在随后的详细视图中,将该 navBarHidden 属性作为@Binding(它在上面传入)

@Binding var navBarHidden : Bool

var body: some View {
    Text("Hello Detail View!")
        .navigationBarTitle("Detail")
        .onAppear() {
            self.navBarHidden = false
        }

}
Run Code Online (Sandbox Code Playgroud)

onAppear()在详细视图中调用上面的 时,它会将原始属性设置为 false 以隐藏,从而显示导航栏。当您单击返回返回主视图时,onAppear()主视图的 再次被调用,将其设置回 hidden = true。


Joh*_* M. -1

根据您发布的代码有点难以判断,但看起来您正在尝试呈现一个在showSaveThePlanettrue 时从底部向上滑动的视图,并且仅在该视图出现时才显示导航栏。

.navigationBarHidden(!showSaveThePlanet)这可以通过设置在您的财产的任何地方来完成body。请注意,您的代码不会使用NavigationLink任何地方将新视图推送到NavigationView堆栈上,因此您不会获得后退按钮。您可以添加自己的按钮来关闭工作表.navigationBarItems(leading:)

这是一个简单的例子,展示了我的意思。

struct ContentView: View {
    @State private var detailShowing = false

    var body: some View {
        NavigationView {
            ZStack(alignment: Alignment(horizontal: .center, vertical: .top)) {
                Color.gray.edgesIgnoringSafeArea(.all)

                // A card-like view that is initially offscreen,
                // and slides on when detailShowing == true
                DetailView()
                    .offset(x: 0, y: detailShowing ? 120 : UIScreen.main.bounds.height)
                    .animation(.spring())

                // Just here to change state
                Button("Toggle") {
                        self.detailShowing.toggle()
                }
                .padding()
                .offset(x: 0, y: detailShowing ? 0 : 44)
                .animation(.none)
            }
            // This is the key modifier
            .navigationBarHidden(!detailShowing)
            .navigationBarTitle("Detail View", displayMode: .inline)
            .navigationBarItems(leading: Button("Close") {
                self.detailShowing = false
            })
        }
    }
}

struct DetailView: View {
    var body: some View {
        ZStack(alignment: Alignment(horizontal: .center, vertical: .top)) {
            RoundedRectangle(cornerRadius: 15).fill(Color.secondary).frame(width: 300, height: 500)
            Text("Detail Content")
                .padding()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)