swift 单击文本时显示新视图并完全破坏旧视图

z9ju0rcb  于 2022-10-31  发布在  Swift
关注(0)|答案(1)|浏览(146)

所以我一直想这样做一段时间,但我不知道如何处理这一点,所以我伸出手来,看看是否有人可以帮助我。
假设我有以下代码,当应用程序加载时,它会加载“MainView”:

struct MapGlider: App {
    @ObservedObject var mainViewModel = MainViewModel()
    var body: some Scene {
        WindowGroup {
            MainView()
                .environmentObject(mainViewModel)
        }
    }
}

这会在应用程序打开时加载Map,这太棒了!在那里一切都很好。
现在,我将在应用程序加载时切换到显示OnboardingView(),例如:

struct MapGlider: App {
    @ObservedObject var mainViewModel = MainViewModel()
    var body: some Scene {
        WindowGroup {
            OnboardingView()
        }
    }
}

现在,我有一个OnboardingView,它显示了一个带有一些选项的ZStack,如下面的代码所示:

struct OnboardingView: View {
    @State private var showGetStartedSheet = false
    @ObservedObject var mainViewModel = MainViewModel()
    var body: some View {
        if #available(iOS 16.0, *) {
            NavigationStack {
                ZStack(alignment: .top) {
                    VStack {
                        LazyVGrid(columns: [GridItem(), GridItem(), GridItem(alignment: .topTrailing)], content: {
                            Spacer()
                            Image("onboarding-logo")
                                .border(.red)

                            NavigationLink(destination: MainView().environmentObject(mainViewModel), label: {
                                Text("Skip")
                            })
                        })
                        .border(.red)
                    }
                }
                .border(.blue)
            }
        } else {
            // Fallback on earlier versions
        }
    }
}

它输出以下内容:

我想要达到的目标

  • 当有人点击“Skip”文本时,将删除OnboardingView并显示MainView()
  • 最接近我得到的是设置一个NavigationLink,但它有一个后退按钮,并不工作得很好,我希望能够去MainView,而不能回到OnboardingView

我们将非常感谢您的帮助!

czfnxgou

czfnxgou1#

您可以使用容器视图,根据变量(存储在父级)的状态,有条件地显示Onboarding视图或主视图。
应该可以轻松应用于您的代码的简化示例:

class AppState: ObservableObject {
    @Published var showOnboarding = true
}

@main
struct CustomCardViewApp: App {
    @StateObject var appState = AppState()

    var body: some Scene {
        WindowGroup {
            MainScreenContainer(showOnboarding: $appState.showOnboarding)
        }
    }
}

struct MainScreenContainer: View {
    @Binding var showOnboarding: Bool

    var body: some View {
        if showOnboarding {
            OnboardingView(showOnboarding: $showOnboarding)
        } else {
            MainView()
        }
    }
}

struct OnboardingView: View {
    @Binding var showOnboarding: Bool

    var body: some View {
        Text("Onboarding")
        Button("Skip") {
            showOnboarding = false
        }
    }
}

struct MainView: View {
    var body: some View {
        Text("Main")
    }
}

相关问题