繁体   English   中英

如何使用 Button Tap 移动 SwiftUI 中的视图或向 NavigationLink 添加操作?

[英]How to move Views in SwiftUI with Button Tap or add an action to NavigationLink?

我知道这个问题已经被问了一百万次了,但无论如何我仍然找不到一个好的答案。

一直在使用 SwiftUI(刚刚开始)并使用现有代码包括 Firebase 通过电话注册/登录。

流量是

  1. 显示入职屏幕 (OnboardingStepView)
  2. 显示电话输入屏幕 (LoginView)
  3. 显示电话号码验证 (VerificationView)
  4. 显示捕获更多用户数据视图 (RegisterView)
  5. Go 到主页 (HomeView)

在我的第一个视图(ContentView)中,我有以下代码:

    struct ContentView: View {
    @AppStorage("log_Status") var status = false

    @State private var onboardinDone = false
    var data = OnboardingDataModel.data
    var body: some View {
        
        ZStack{
            Group {
                if !onboardinDone {
                    OnboardingViewPure(data: data, doneFunction: {
                        status = true
                        self.onboardinDone = true
                        
                        print("done onboarding")
                    })
                
            } else {
                
                NavigationView{
                    
                    VStack{
                        
                        if status{Home()}
                        else{Login()}
                    }
                    .preferredColorScheme(.dark)
                    .navigationBarHidden(true)
                }
            }
        }
    }
}
}

现在,所有视图都已编码并且可以正常工作(使用 Firebase),并且在以前的 Swift 版本中,当点击按钮时我会继续。 但是,在 SwiftUI 中,这不是一个选项,您现在需要使用导航链接(可能看起来像一个按钮)。

例如,在我的“ VerficationView ”中有一个执行操作的按钮。

按钮(操作:loginData.verifyCode){

现在,在点击按钮并在后台验证数据后,我想移动到我创建的下一个视图,该视图注册用户的“姓名、简历和图像”( RegisterView )。 此视图工作并将用户的数据注册在 Firebase 中。 但是,一旦用户单击上述按钮,我不知道如何正确呈现此屏幕。

  • 我是否将按钮更改为导航链接,我可以向其中添加操作吗?
  • 我是否使用@State 设置视图的 state 和“isActive”来跟踪显示的内容?
  • 我是否使用“母视图”并且该视图始终跟踪显示的视图?

请让我知道您的想法,因为我被卡住了,不知道如何继续....

谢谢!

我会将此作为评论发布,但我没有足够的声誉。

我通过将登录屏幕显示为 a.fullScreenCover 解决了类似的问题。 这使它脱离了正常的导航层次结构,因此 ContentView 仍然是根视图。 登录完成后,通过 @Binding 更改 ContentView 中的 Bool。 这将更改 ContentView 的 state,因此现在 ifelse 可以将用户发送到您的第一页。

.fullScreenCover(isPresented: $isPresented) {

编辑:

也许不需要 FullScreenCover 只是else if 见下文。

struct ContentView: View {
    
    @State private var isOnboardinDone: Bool = false
    @State private var isLoggedIn: Bool = false
    
    var body: some View {
        if isOnboardinDone && isLoggedIn {
            FirstView()
        } else if !isOnboardinDone {
            OnboardingView(done: $isOnboardinDone)
        } else {
            LoginView(loggedIn: $isLoggedIn)
        }
        
    }
}
struct FirstView: View {
    var body: some View {
        Text("First")
    }
}

struct OnboardingView: View {
    @Binding var done: Bool
    var body: some View {
        Button(action: { done.toggle() }, label: {
            Text("On Boarding done.")
        })
    }
}
struct LoginView: View {
    @Binding var loggedIn: Bool
    var body: some View {
        Button(action: { loggedIn.toggle() }, label: {
            Text("Login")
        })
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM