在 SwiftUI 中满足条件时显示新视图

Present a new view when a condition has been met in SwiftUI

大家好,我是 SwiftUI 的新手。我需要仅在检查条件后以模态呈现方式呈现包含两个文本字段的视图。


示例 .. 当用户按下登录按钮时,我需要应用程序检查数据库中是否存在用户。如果用户存在,他可以访问该应用程序,否则他必须显示一个视图,他必须在其中输入他的名字和姓氏。

With UIKit 我用它来呈现 structureclass

self.present(userFound ? Home() : UserNameInfo(), animated: true, completion: nil)

但是 SwiftUI 我不知道如何解决这个问题。

你能帮我什么忙吗?

我的代码

 var body: some View {
        
        ZStack(alignment: .top) {
            
            Color(.black).ignoresSafeArea()
            
            gradientBackground().ignoresSafeArea()

            VStack(alignment: .center, spacing: 25) {
                
                Spacer()
               
                logoStack()
                
                // Messaggio di benvenuto
                VStack(alignment: .leading, spacing: 15) {
                    
                    Text("Effettua l'accesso al tuo account")
                        .font(.title2.bold())
                   
                    Text("Riserva un momento esclusivo prenotando un taglio tradizionale oppure una rasatura con panni caldi e trattamenti viso")
                        .font(.callout.weight(.light))
                }
                .foregroundColor(.white)
                //.dynamicTypeSize(.medium)
                
                // Apple Sign In  Button
                SignInWithAppleView()
                    .frame(width: screen.size.width - 56)
                    .frame(height: 45, alignment: .center)
                    .onTapGesture(perform: showAppleLoginView)
                                
                // Divisore
                Divider().background(.gray)

                // Messaggio sull'accettazione della Privacy e delle Condizioni di utilizzo
                VStack(spacing: 5) {
                    Text("Continuando dichiaro di accettare le ")
                        .multilineTextAlignment(.center)
        
                    HStack(spacing: 0) {
                        Button("Condizioni di Utilizzo") {}
                        .foregroundColor(.white)
                        .font(.footnote.bold())
        
                        Text(" ed i ")
        
                        Button("Termini sulla Privacy") {}
                        .foregroundColor(.white)
                        .font(.footnote.bold())
        
                        Text(".")
                    }
                }
                .foregroundColor(.gray)
                .font(.footnote)
                .padding(.bottom, 25)

            }
            .padding(.horizontal)
        }

    private func showAppleLoginView() {
        
      // Show modalview if user not exist in Firebase
    }

// MARK: - Apple Sign In Button View Representable
struct SignInWithAppleView: UIViewRepresentable {
    
    typealias UIViewType = ASAuthorizationAppleIDButton
    
    func makeUIView(context: Context) -> UIViewType {
        ASAuthorizationAppleIDButton(type: .signIn, style: .white)
    }
    
    func updateUIView(_ uiView: UIViewType, context: Context) {}
}

您可以使用修饰符 .fullScreenCover

& 您只需要将绑定传递给 @State var,当您想要显示模式时将其设置为 true。

例子

struct ExampleScreenView: View {
    @State var showModal: Bool = false

    var body: some View {
        VStack {
            Text("Some Text")
                .padding()

            Button {
                showModal = true
            } label: {
                Text("Show other view")
            }
        }
        .fullScreenCover(isPresented: $showModal) {
            VStack {
                Color.white
                Text("Some other text")
                    .padding()

                Button {
                    showModal = false
                } label: {
                    Text("close view")
                }
            }
        }
    }
}

这个例子中第一个视图有一个按钮将 bool 设置为 true,并显示模态,模态视图有一个按钮将 bool 设置为 false 并关闭视图。

按钮只是为了示例,但您可以使用任何逻辑来设置布尔值。设置为 true,然后您就可以在 fullScreenCover 中呈现您选择的任何视图。

针对登录场景,可以使用.onReceive修饰符监听登录成功代码发送的通知。

.onReceive(NotificationCenter.default.publisher(for: Notification.Name(rawValue: "didLogin"))

&

NotificationCenter.post(name:Notification.Name("didLogin"), object: nil)