【问题标题】:How to dynamically hide navigation back button in SwiftUI如何在 SwiftUI 中动态隐藏导航返回按钮
【发布时间】:2020-05-08 18:50:17
【问题描述】:

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

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

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。很好地抓住了 GUI 更新所需的“主线程”。我的坏那里。但是,在我的“真实”情况下,这不是问题。设置 navigationBarTitle 为我解决了这个问题。如果您出于某种原因不想设置标题,也可以添加一个 navigationBarItem 来解决这个问题。知道为什么需要对 NavBar 进行这些修改才能使其正常工作吗?
    猜你喜欢
    • 2019-11-28
    • 2020-04-06
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多