【问题标题】:Variables Not Updated Swift 5, SwiftUI, Firebase变量未更新 Swift 5、SwiftUI、Firebase
【发布时间】:2021-07-03 01:27:49
【问题描述】:

在我的 UserViewModel 中,我有一个密码重置功能。这可行,但我希望它返回我的主视图有关错误的信息,或者它是否成功。遗憾的是,仅返回默认值,然后在函数本身中更新这些值。

    func passwordResetRequest(_ email: String) -> (successful: Bool, errorMsg: String) {
        var status = false
        var errorMessage = "0"
        Auth.auth().sendPasswordReset(withEmail: email) { error in
            if error != nil {
                errorMessage = error?.localizedDescription ?? "unknown error"
                print("In UserViewModel.PasswordResetRequest(): \(errorMessage)")
                status = false
            } else {
                print("success")
                status = true
            }
        }
        return (status,errorMessage)
    }

这是视图中的代码:

VStack(spacing: 13){
                HStack(spacing: 0) {
                    Text("Forget your password? ")
                    Button(action: {
                        let result = user.passwordResetRequest(email)
                        print(result)
                        if (result.successful) {
                            showingResetPasswordAlert = true
                        } else {
                            self.errorMsg = result.errorMsg
                            print(result.errorMsg)
                            print(errorMsg)
                            print("from button^")
                            showingErrorMsg = true
                        }

                    }, label: {
                        Text("Reset Password")
                            .font(.callout)
                            .foregroundColor(.black)
                            .bold()
                    }).alert(isPresented: $showingResetPasswordAlert) {
                        Alert(title: Text("Important message"), message: Text("Password Reset Email will be sent to \(email)"), dismissButton: .default(Text("Got it!")))
                    }
                    .alert(isPresented: $showingErrorMsg) {
                        Alert(title: Text("Important message"), message: Text("Error: \(self.errorMsg) occured during the password reset for the email:  \(email)"), dismissButton: .default(Text("Got it..")))
                    }
                }

这是控制台输出:

(successful: false, errorMsg: "0")
0
0
from button^
In UserViewModel.PasswordResetRequest(): An email address must be provided.

所以,问题是 passwordResetRequest 的第 6 行似乎不起作用,或者似乎在此块运行之前调用了 return 语句。

【问题讨论】:

    标签: swift firebase swiftui firebase-authentication


    【解决方案1】:

    您的函数 passwordResetRequest 立即返回,status = false 和 errorMessage = "0"。 passwordResetRequest 是一个异步函数,因此请尝试以下操作:

    func passwordResetRequest(email: String,
                              onSuccess: @escaping() -> Void,
                              onError: @escaping(_ errorMessage: String) -> Void) {
        
        Auth.auth().sendPasswordReset(withEmail: email) { error in
            if error != nil {
                onError(error!.localizedDescription)
            } else {
                onSuccess()
            }
        }
    }
    

    并在您的 Button 操作中这样调用它:

            passwordResetRequest(email: email, onSuccess: {
                print("---> onSuccess")
            }) { error in
                print("---> error: \(error)")
            }
    

    【讨论】:

    • 对于我使用的按钮的调用: Button(action: { user.passwordResetRequest(email, onSuccess: {showingResetPasswordAlert = true }, onError: { err in self.errorMsg = err print(errorMsg)显示ErrorMsg = true }) }
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多