我的应用程序在 Swift UI 上运行,我的主页是Home(),在主页中有NavigationView和NavigationLink(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)
什么对我有用:@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)
| 归档时间: |
|
| 查看次数: |
3640 次 |
| 最近记录: |