【问题标题】:How to move Views in SwiftUI with Button Tap or add an action to NavigationLink?如何使用 Button Tap 在 SwiftUI 中移动视图或向 NavigationLink 添加操作?
【发布时间】:2021-03-28 20:53:09
【问题描述】:

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

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

流程是

  1. 显示入职屏幕 (OnboardingStepView)
  2. 显示电话输入屏幕 (LoginView)
  3. 显示电话号码验证 (VerificationView)
  4. 显示捕获更多用户数据视图 (RegisterView)
  5. 转到主页 (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 版本中,我会在点击按钮时进行 segue。但是,在 SwiftUI 中这不是一个选项,您现在需要使用导航链接(可能看起来像一个按钮)。

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

按钮(操作:loginData.verifyCode){

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

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

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

谢谢!

【问题讨论】:

    标签: ios swift xcode swiftui


    【解决方案1】:

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

    我通过将登录屏幕显示为 .fullScreenCover 解决了类似的问题。这使它脱离了正常的导航层次结构,因此 ContentView 仍然是根视图。登录完成后,通过 @Binding 更改 ContentView 中的 Bool。这将改变 ContentView 的状态,因此现在 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")
            })
        }
    }
    

    【讨论】:

    • 感谢您的建议!但是,如果我的入门屏幕首先显示,如果我将它与登录屏幕重叠,这将如何工作?
    • 太棒了,谢谢!会玩这个。所以基本上最好的方法是使用变量的状态并将它们绑定到其他视图?
    • 不用担心。您还可以将sheetsfullScreenCover 附加到EmptyView()
    • 这在我的情况下不起作用,因为按钮中有一个动作,它要求我删除添加切换的动作......它让我发疯,因为简单的 segue 选项很容易而且现在我又学会了哈哈
    • 在没有更多代码或错误消息的情况下,我有点难以提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-08-23
    • 2022-11-27
    • 2021-12-25
    • 1970-01-01
    • 2020-04-10
    • 2020-09-10
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多