如何在SwiftUI中动态隐藏导航后退按钮
在异步操作期间,我需要在视图中暂时隐藏后退按钮。 我想防止用户在操作完成之前离开视图 可以使用.navigationBarBackButtonHidden(true)永久隐藏它。 但是,很明显,在这种情况下,用户无法返回,所以他们被卡住了。 我错过了什么 下面是一个人为的例子来演示:如何在SwiftUI中动态隐藏导航后退按钮,swift,swiftui,Swift,Swiftui,在异步操作期间,我需要在视图中暂时隐藏后退按钮。 我想防止用户在操作完成之前离开视图 可以使用.navigationBarBackButtonHidden(true)永久隐藏它。 但是,很明显,在这种情况下,用户无法返回,所以他们被卡住了。 我错过了什么 下面是一个人为的例子来演示: struct TimerTest: View { @State var isTimerRunning = false var body: some View { Button(ac
struct TimerTest: View {
@State var isTimerRunning = false
var body: some View {
Button(action:self.startTimer) {
Text("Start Timer")
}
.navigationBarBackButtonHidden(isTimerRunning)
//.navigationBarBackButtonHidden(true) // This does hide it, but then it can't be unhidden.
}
func startTimer()
{
self.isTimerRunning = true
_ = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { timer in
print("Timer fired!")
self.isTimerRunning = false
}
}
}
这是一个有效的解决方案。“后退”按钮不能隐藏,它由工具栏管理,由父视图拥有,但可以使用下面的方法隐藏整个导航栏 使用Xcode 11.4/iOS 13.4进行测试 结构父视图:视图{ @状态变量isTimerRunning=false var body:一些观点{ 导航视图{ VStack{ 导航链接(“Go”,目的地:TimerTest(isTimerRunning:$isTimerRunning)) } .navigationBarHidden(正在运行)
.navigationBarTitle(“Main”)//非常感谢。GUI更新所需的“主线程”捕捉得很好。我的不好。但是,在我的“real”中在这种情况下,这不是问题所在。设置navigationBarTitle为我解决了问题。如果你不想出于任何原因设置标题,也可以添加navigationBarItem来解决问题。你知道为什么需要对导航栏进行这些修改才能使其正常工作吗?
struct ParentView: View {
@State var isTimerRunning = false
var body: some View {
NavigationView {
VStack {
NavigationLink("Go", destination: TimerTest(isTimerRunning: $isTimerRunning))
}
.navigationBarHidden(isTimerRunning)
.navigationBarTitle("Main") // << required, at least empty !!
}
}
}
struct TimerTest: View {
@Binding var isTimerRunning: Bool
var body: some View {
Button(action:self.startTimer) {
Text("Start Timer")
}
}
func startTimer()
{
self.isTimerRunning = true
_ = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { timer in
DispatchQueue.main.async { // << required !!
self.isTimerRunning = false
}
}
}
}