禁用 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()})
我正在使用 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()})