删除当前视图,然后导航到 swiftui 中的另一个视图

问题描述 投票:0回答:1

有没有办法在 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()
    }
}

我提供了最简单的代码来说明问题

swiftui navigation
1个回答
0
投票

我的理解是否正确,您想要关闭当前视图,然后转到新视图,并且全部带有动画?

我建议为此使用

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")
    }
}

Animation

© www.soinside.com 2019 - 2024. All rights reserved.