繁体   English   中英

SwiftUI - NavigationLink 视图中的 NavigationBar 快速显示然后消失

[英]SwiftUI - NavigationBar in View from NavigationLink quickly showing then disappearing

我有一个ContentView包含一个NavigationView ,导致一个DestinationView 我想在ContentView隐藏导航栏,但在DestinationView显示它。 为了在ContentView隐藏它,我将navigationBarHidden设置为true并给navigationBarTitle一个空字符串。 DestinationView我将navigationBarHidden设置为 false 并将其命名为“DestinationView”。

如果我运行该项目并点击NavigationLink ,则DestinationView显示NavigationBar但在视图出现后快速隐藏它。 有人可以帮我解决这个问题吗?

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.red.frame(maxWidth: .infinity, maxHeight: .infinity)
                NavigationLink(destination: DestinationView()) {
                    ZStack {
                        Color.green.frame(width: 200, height: 200)
                        Text("Tap me")
                    }
                }
            }
            .navigationBarTitle("")
            .navigationBarHidden(true)
        }
    }
}

struct DestinationView: View {
    var body: some View {
        List {
            Text("1")
            Text("2")
        }
        .navigationBarTitle("DestinationView")
        .navigationBarHidden(false)
    }
}

在此处输入图片说明

您需要使用变量来实现这一点并将其与您的目的地绑定

struct ContentView: View {
         @State var isNavigationBarHidden: Bool = true
        var body: some View {
            NavigationView {

                ZStack {
                    Color.red.frame(maxWidth: .infinity, maxHeight: .infinity)
                    NavigationLink(destination: DestinationView(isNavigationBarHidden: self.$isNavigationBarHidden)) {
                        ZStack {
                            Color.green.frame(width: 200, height: 200)
                            Text("Tap me")
                        }
                    }

                }
                .navigationBarHidden(self.isNavigationBarHidden)
                .navigationBarTitle("")
                .onAppear {
                    self.isNavigationBarHidden = true
                }
            }
        }
    }

    struct DestinationView: View {
        @Binding var isNavigationBarHidden: Bool
        var body: some View {
            List {
                Text("1")
                Text("2")
            }
            .navigationBarTitle("DestinationView")

            .onAppear {
                self.isNavigationBarHidden = false
            }
        }
    }

安全区域布局指南存在问题

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.red.frame(maxWidth: .infinity, maxHeight: .infinity)
                VStack {
                    NavigationLink(destination: DestinationView()) {
                        ZStack {
                            Color.green.frame(width: 200, height: 200)
                            Text("Tap me")
                        }
                    }
                }
            }.edgesIgnoringSafeArea(.all)
            .navigationBarHidden(true)
        }
    }
}

struct DestinationView: View {
    var body: some View {
        VStack {
            List {
                Text("1")
                Text("2")
            }
        }.navigationBarTitle("DestinationView")
        .navigationBarHidden(false)
    }
}

快乐编码...

编辑:使用接受的答案,因为它是一个清洁的解决方案。


我遇到了这个错误并最终使用UIViewControllerRepresentable来包装一个控制器,该控制器在其viewDidAppear方法中设置导航栏隐藏状态:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.red.frame(maxWidth: .infinity, maxHeight: .infinity)
                NavigationLink(destination: DestinationView()) {
                    ZStack {
                        Color.green.frame(width: 200, height: 200)
                        Text("Tap me")
                    }
                }
            }
            .navigationBarTitle("")
            .navigationBarHidden(true)
        }
    }
}

struct DestinationView: View {
    var body: some View {
        List {
            Text("1")
            Text("2")
        }
        .navigationBarTitle("DestinationView")
        .navigationBarHidden(false)
        .background(HorribleHack())
    }
}

struct HorribleHack: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> HorribleHackViewController {
        HorribleHackViewController()
    }

    func updateUIViewController(_ uiViewController: HorribleHackViewController, context: Context) {
    }
}

class HorribleHackViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        DispatchQueue.main.async {
            self.navigationController?.setNavigationBarHidden(false, animated: false)
        }
    }
}

对我来说,通过视图层次结构传递绑定并不是最佳选择,将状态添加到环境变量是可取的。

class SceneState: ObservableObject {
    @Published var isNavigationBarHidden = true
}


class SceneDelegate: UIResponder, UIWindowSceneDelegate {
...
    var sceneState = SceneState()

...
    let contentView = ContentView().environmentObject(sceneState)
...
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            View1()
        }
    }
}

struct View1: View {
    @EnvironmentObject var sceneState: SceneState
    @State private var showView2: Bool = false

    var body: some View {
        VStack {
            Text("NO nav bar.")
            Button("Go to View2") {
                self.showView2 = true
            }
            NavigationLink(destination: View2(), isActive: $showView2, label: {EmptyView()})
        }
        .navigationBarHidden(self.sceneState.isNavigationBarHidden)
        .navigationBarTitle("")
        .navigationBarBackButtonHidden(self.sceneState.isNavigationBarHidden)
    }
}


struct View2: View {
    @EnvironmentObject var sceneState: SceneState

     var body: some View {
        VStack {
            Text("WITH nav bar.")
        }
            .navigationBarHidden(self.sceneState.isNavigationBarHidden)
            .navigationBarTitle("WWDC")
            .navigationBarBackButtonHidden(self.sceneState.isNavigationBarHidden)
            .onAppear {
                self.sceneState.isNavigationBarHidden = false
        }
    }
}

这个问题实际上有一个非常简单的解决方案。 经过多次尝试,我想通了,您必须像这样将.navigationBarHidden(false)直接添加到NavigationLink内的目标视图中:

struct ContentView: View {
    var body: some View {
        NavigationView {
            ZStack {
                Color.red.frame(maxWidth: .infinity, maxHeight: .infinity)
                NavigationLink(destination: DestinationView()
                   .navigationBarHidden(false)) {
                    ZStack {
                        Color.green.frame(width: 200, height: 200)
                        Text("Tap me")
                    }
                }
            }
            .navigationBarTitle("")
            .navigationBarHidden(true)
        }
    }
}

struct DestinationView: View {
    var body: some View {
        List {
            Text("1")
            Text("2")
        }
        .navigationBarTitle("DestinationView")
        .navigationBarHidden(false)
    }
}

它将按预期工作,出现后不会消失。

我在 iOS 14 模拟器上运行此代码并且导航栏没有隐藏,所以我认为这可能是 iOS 13 的问题。我有一个类似的问题,我的代码导致导航栏在 iOS 13.5 模拟器上消失了iOS 14.4 模拟器。

暂无
暂无

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

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