如何在SwiftUI中动态隐藏导航后退按钮

如何在SwiftUI中动态隐藏导航后退按钮,swift,swiftui,Swift,Swiftui,在异步操作期间,我需要在视图中暂时隐藏后退按钮。 我想防止用户在操作完成之前离开视图 可以使用.navigationBarBackButtonHidden(true)永久隐藏它。 但是,很明显,在这种情况下,用户无法返回,所以他们被卡住了。 我错过了什么 下面是一个人为的例子来演示: struct TimerTest: View { @State var isTimerRunning = false var body: some View { Button(ac

在异步操作期间,我需要在视图中暂时隐藏后退按钮。 我想防止用户在操作完成之前离开视图

可以使用.navigationBarBackButtonHidden(true)永久隐藏它。 但是,很明显,在这种情况下,用户无法返回,所以他们被卡住了。 我错过了什么

下面是一个人为的例子来演示:

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
            }
        }
    }
}