首页 > 解决方案 > 为什么将 .navigationBarBackButtonHidden(true) 添加到我的 ContentView 会破坏核心 NavigationView 动画以切换视图?这是一个错误吗?

问题描述

在我的 ContentView 中,我有类似的东西:


import SwiftUI

struct MainContentView : View {
    var body: some View {
        Text("Main Content View")
    }
}

struct AlternateView : View {
    var body: some View {
        Text("Alternate View")
    }
}

struct ContentView : View {
    @State private var selection: String? = "Main"
    var body: some View {
        ZStack {
                NavigationView {
                    VStack {
                        ZStack {
                            Color.clear
                            AlternateView()
                                .navigationBarHidden(true)
                                .edgesIgnoringSafeArea(.top)

                            //button to go back to the MainContentView()
                            //AlternateViewBackButton(button_action: self.hide_alternate_view)
                        }
                        NavigationLink(destination:
                                        MainContentView()
                                       //why cant I do this without breaking NavigationView?
                                       //.navigationBarBackButtonHidden(true)
                                       ,
                                       tag: "Main",
                                       selection: $selection)
                        {
                            EmptyView()
                        }
                        .navigationBarHidden(true)
                        .navigationBarTitle("")
                        .navigationBarBackButtonHidden(true)
                    }
                }
                .edgesIgnoringSafeArea(.all)
        }
    }
}

我的问题在上面评论的代码中。为什么添加 navigationBarBackButtonHidden(true) 会破坏我可以从屏幕左侧拖动到右侧以在两个视图之间设置动画的功能?这是我做错了什么吗?或者它是一个 SwiftUI 错误?

我遇到了一个我认为可以解决此问题的解决方案,即:隐藏导航栏而不丢失 SwiftUI 中的向后滑动手势 它适用于我上面编写的测试用例,但除非我停用我拥有的所有手势,否则在整个程序中失败使用 .simultaneousGesture 安装在 MainContentView

此部分解决方案可能包含在原始代码示例中,并带有以下代码段(从链接的帖子中复制)


extension UINavigationController: UIGestureRecognizerDelegate {
    override open func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}

它似乎适用于测试示例,但是当我在我的主项目中使用它时,它会干扰我在 MainContentView 上安装的手势。我将尝试找出发生这种情况的确切原因,并包括我在下面找到的内容。

-编辑-

这个问题在我的代码库中的表现方式如下:

如果我包含上面的扩展代码片段,取消注释 .navigationBarBackButtonHidden(true),并注释 MainContentView 上的所有手势(包括它的每个子项),则没有后退按钮(如预期的那样)我可以从左向右拖动以访问AlternateView(按预期)。但是,评论 MainContentView 和子项上的手势是不可能的,因为它们控制着应用程序的核心功能。

如果我知道为什么会这样,我就不会再有问题了。在我看来, .navigationBarBackButtonHidden 除了隐藏后退按钮之外不应该改变任何东西。

-编辑结束-

我需要能够处理 MainContentView 和 AlternateView 上的手势。毕竟,处理用户输入是程序的关键部分。

一个相关的问题是:为什么上面的代码在纵向模式下隐藏了导航栏,而在横向模式下显示它?

提前感谢您的帮助!

标签: iosanimationswiftuiback-buttonnavigationview

解决方案


推荐阅读