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

时间:2020-05-08 18:50:17

标签: swift swiftui

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

可以使用.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
        }
    }
}

1 个答案:

答案 0 :(得分:2)

这是有效的解决方案。 “后退”按钮无法隐藏,它由栏管理并由父视图拥有,但是可以通过以下方法隐藏整个导航栏。

通过Xcode 11.4 / iOS 13.4测试

demo

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