SwiftUI - navigationBarBackButtonHidden - 向后滑动手势?

sTO*_*OOs 6 swiftui

如果我设置一个自定义后退按钮(每个人都想要,隐藏丑陋的文本 ;-) )并使用 .navigationBarBackButtonHidden,导航控制器上的标准向后滑动手势不起作用。有没有办法让这个回来并有一个自定义的后退按钮?

例如:

NavigationView {
    NavigationLink(destination: DummyViewer())
     {
       Text("Go to next view"
    } 
 }
Run Code Online (Sandbox Code Playgroud)
struct DummyViewer: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    var body: some View {
        Text("Hello, World!").navigationBarBackButtonHidden(true)
            .navigationBarItems(leading:
                Button(action: { self.presentationMode.wrappedValue.dismiss()}) {
                    Text("Custom go back")
                }
        )
    }
}

Run Code Online (Sandbox Code Playgroud)

如果我这样做,我将无法返回到之前的视图,似乎手势被禁用了......如何取回它?

BR史蒂芬

Nic*_*cci 33

我发现创建自定义 NavigationView 没有任何效果,但我发现通过扩展UINavigationController我能够拥有自定义后退按钮和向后滑动手势。

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

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 仍然适用于 iOS 14.2。多么强大的咒语啊! (2认同)

小智 27

我想整合Nick Bellucci 给出的答案,使代码也可以在其他情况下工作,例如当 NavigationView 的子视图是 ScrollView 或正在侦听拖动手势的 View 时。

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

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

    // To make it works also with ScrollView
    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        true
    }
}
Run Code Online (Sandbox Code Playgroud)


Moj*_*ini -1

您可以将标题设置为空string。所以后栏按钮标题将为空:

struct ContentView: View {

    var body: some View {

        NavigationView {

            NavigationLink(destination: Text("Here you are")) {

                Text("Next").navigationBarTitle("")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以设置标题onAppear,或者onDisappear如果需要的话。