在SwiftUI中服务器响应后尝试推送新视图

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

我想在使用Firebase成功登录后显示我的新视图,我的signUp和Recover密码已经在工作,因为我将其显示为表格,但在此示例中,我想显示一个新视图,我已经尝试过NavigationLink和onReceive一起使用,但我无法执行此工作。

struct LoginView: View {

    @ObservedObject var viewModel = ViewModel()
    @State private var formOffset: CGFloat = 0
    @State private var presentSignUpSheet = false
    @State private var presentPasswordRecoverySheet = false
    @State private var presentLobbySheet = false

    var body: some View {
        VStack {

            HeaderView(title: Constants.appName)
            Spacer()

            Divider()

            Group {
                BodyView(value: viewModel).viewSelection(view: Constants.QuestionnaireView.signIn.rawValue)

                LCButton(text: Constants.login) {
                    self.viewModel.signIn()
                }.alert(isPresented: $viewModel.thereIsAnError) {
                    Alert(title: Text(Constants.alert), message: Text(viewModel.errorMessage), dismissButton: .default(Text(Constants.ok)))
                }

                Button(action: {
                    self.presentSignUpSheet.toggle()
                }) {
                    Text(Constants.signUp)
                }.sheet(isPresented: $presentSignUpSheet) {
                    SignUpView()
                }.padding()

                Button(action: {
                    self.presentPasswordRecoverySheet.toggle()
                }) {
                    Text(Constants.forgotPassword)
                }.sheet(isPresented: $presentPasswordRecoverySheet) {
                    RecoverPasswordView()
                }.padding()
            }


        }.edgesIgnoringSafeArea(.top)
            .padding()
            .offset(y: self.formOffset)
    }
}

class ViewModel: ObservableObject {

    @Published var user = User()
    @Published var confirmPassword = ""
    @Published var thereIsAnError = false
    @Published var errorMessage = ""
    var viewDismissalModePublisher = PassthroughSubject<Bool, Never>()
    var onSuccessLogin = PassthroughSubject<Bool, Never>()

    private var shouldPopView = false {
        didSet {
            viewDismissalModePublisher.send(shouldPopView)
        }
    }

    private var shouldShowLobbyView = false {
        didSet {
            onSuccessLogin.send(shouldShowLobbyView)
        }
    }

    func registerSuccess() {

        self.user.email = ""
        self.user.password = ""
        self.confirmPassword = ""

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.shouldPopView = true
        }
    }

    func signUpProcess() {
        if user.password != confirmPassword {
            errorMessage = Constants.passConfirmWrong
            thereIsAnError.toggle()
        } else {
            signUp()
        }
    }

    func signUp() {
        Auth.auth().createUser(withEmail: user.email, password: user.password) { (result, error) in
            if error != nil {
                self.errorMessage = error!.localizedDescription
                self.thereIsAnError.toggle()
            } else {
                self.registerSuccess()
            }
        }
    }

    func signIn() {
        Auth.auth().signIn(withEmail: user.email, password: user.password) { (result, error) in
            if error != nil {
                self.errorMessage = error!.localizedDescription
                self.thereIsAnError.toggle()
            } else {
                self.shouldShowLobbyView.toggle()
                self.user.email = ""
                self.user.password = ""
            }
        }
    }

    func recoverPassword() {
        Auth.auth().sendPasswordReset(withEmail: user.email) { (error) in
            if error != nil {
                self.errorMessage = error!.localizedDescription
                self.thereIsAnError.toggle()
            }  else {
                self.user.email = ""
                DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                    self.shouldPopView = true
                }
            }
        }
    }
}
swiftui
1个回答
0
投票

我有一个类似的问题,我找到了一个模拟某些导航的解决方案

我打算在这里写基础知识,但是再贴上带说明的源代码也没什么更好。

ViewRouter Tutorial

这包含一个ObservableObject作为EnvironmentObject,它使您可以全屏显示视图,而不是工作表。

在您的情况下,您将拥有一个LoginView,并且在此视图中,您可以打开“注册”和“恢复密码”视图的工作表,并以全屏视图的形式打开LobbyView,就像在UIKit中使用present方法一样。

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