禁用 SwiftUI NavigationView 滑动到弹出功能

Disable SwiftUI NavigationView Swipe to Pop feature

我正在使用 SwiftUI NavigationView 导航到三个页面。 导航工作正常,我可以转到我想要的页面并使用后退按钮返回上一页。

我的问题是每当我从屏幕的最左边滑动时,它会弹出我当前的屏幕。

每当我从屏幕的最左侧拖动时,我的当前屏幕也会随之移动,显示堆栈中的前一个屏幕,然后弹出所述当前屏幕。

有没有办法禁用此功能?

Page Two to One

Page One to Landing

ContentView.swift

import SwiftUI

struct ContentView: View {
    @State var destinationKey: String? = nil;

    var body: some View {
        NavigationView{
            VStack{
                Text("Hello, world! Landing Page")
                    .padding()
            
                Button(action: {
                    destinationKey = "pageOne"
                }) {
                    Text("Go To Page One")
                        .padding()
                }
            
            }
            .background(
                NavigationLink(destination: PageOne(), tag: ("pageOne"), selection: $destinationKey){
                    EmptyView()
                }
            )
        }
        .navigationViewStyle(StackNavigationViewStyle())

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

PageOne.swift

import SwiftUI

struct PageOne: View {
    
    var body: some View {
        VStack{
            Text("Hello, World! Page One")
        
            NavigationLink(destination: PageTwo(), label: {
                Text("Go To Page Two")
                    .padding()
            
            })
        
        
        }
    }
}

struct PageOne_Previews: PreviewProvider {
    static var previews: some View {
        PageOne()
    }
}

PageTwo.swift

import SwiftUI

struct PageTwo: View {
    var body: some View {
        Text("Hello, World! Page Two")
    }
}

struct PageTwo_Previews: PreviewProvider {
    static var previews: some View {
        PageTwo()
    }
}

截至目前,禁用滑动关闭的唯一方法是禁用后退按钮:

 .navigationBarBackButtonHidden(true)

如果您仍然希望有一个后退按钮,您可以创建一个自定义按钮:

.navigationBarItems(leading: Button("Back"){self.presentationMode.wrappedValue.dismiss()})

注意:此代码放在presenting view中,记得做

@Environment(\.presentationMode) var presentationMode

在 iOS 14 及之前的结构中, 或者如果你在 iOS 15 你可以简单地做:

@Environment(\.dismiss) var dismiss

只需在自定义后退按钮中调用 dismiss() 即可:

.navigationBarItems(leading: Button("Back"){dismiss()})