有没有办法在 swiftui 中删除当前视图然后转到另一个视图?
我不想立即导航到第三个视图,我需要在导航到第三个视图之前删除当前视图:
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
Text("1")
NavigationLink(destination: Page2View()) {
Text("View Page 2")
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
.padding()
}
.navigationBarTitle("Main Page")
}
}
}
struct Page2View: View {
var body: some View {
Text("This is Page 2")
.navigationBarTitle("Page 2")
}
}
struct Page3View: View {
var body: some View {
Text("This is Page 3")
.navigationBarTitle("Page 3")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我提供了最简单的代码来说明问题
我的理解是否正确,您想要关闭当前视图,然后转到新视图,并且全部带有动画?
我建议为此使用
NavigationStack
和 path
,而不是 NavigationView
(已弃用)。绑定可以传递给子视图,这允许它们设置要转到的下一个视图。
我一开始尝试在延迟后导航到新视图。我发现1s就够了,0.5s还不够。所以我建议改为导航到
.onDisappear
中的视图,这样可以避免返回根视图后的任何等待,并且看起来更可靠:
enum NavDestination {
case page2
case page3
}
struct ContentView: View {
@State private var navPath = [NavDestination]()
@State private var nextView: NavDestination?
private func goToNextViewIfSet() {
if let nextView {
navPath.append(nextView)
}
nextView = nil
}
var body: some View {
NavigationStack(path: $navPath) {
VStack(spacing: 30) {
Text("Page 1")
NavigationLink(value: NavDestination.page2) {
Text("Go to Page 2")
}
.buttonStyle(.borderedProminent)
}
.navigationBarTitle("Main Page")
.navigationDestination(for: NavDestination.self) { navDestination in
switch navDestination {
case .page2:
Page2View(nextView: $nextView)
.onDisappear(perform: goToNextViewIfSet)
case .page3:
Page3View(nextView: $nextView)
.onDisappear(perform: goToNextViewIfSet)
}
}
}
}
}
struct Page2View: View {
@Environment(\.dismiss) private var dismiss
@Binding var nextView: NavDestination?
var body: some View {
VStack(spacing: 30) {
Text("This is Page 2")
Button("Go to Page 3") {
nextView = .page3
dismiss()
}
.buttonStyle(.borderedProminent)
}
.navigationBarTitle("Page 2")
}
}
struct Page3View: View {
@Environment(\.dismiss) private var dismiss
@Binding var nextView: NavDestination?
var body: some View {
VStack(spacing: 30) {
Text("This is Page 3")
Button("Go to Page 2") {
nextView = .page2
dismiss()
}
.buttonStyle(.borderedProminent)
}
.navigationBarTitle("Page 3")
}
}