繁体   English   中英

如何在 SwiftUI 中动态隐藏导航返回按钮

[英]How to dynamically hide navigation back button in SwiftUI

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

可以使用.navigationBarBackButtonHidden(true)永久隐藏它。 但是,在这种情况下,显然用户不能 go 回来,所以他们被卡住了。 我错过了什么?

这是一个人为的示例来演示:

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 测试

演示

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

备份

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM