【问题标题】:How can I validate textField input with a Firestore query call?如何使用 Firestore 查询调用验证 textField 输入?
【发布时间】:2021-06-30 09:02:30
【问题描述】:

所以我的目标是通过检查该值是否在 Firestore 集合中的任何文档中来验证文本字段。所以在我的另一个验证函数中,我可以返回一个字符串并显示一个带有错误的警报,如下所示:

 func validateFields() -> String? {
    if nameTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        emailTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        passwordTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        schoolIDTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
        currentGradeTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""{
        
        showAlert(title: "Missing Fields", message: "Please fill in all fields.")
        return "Issue With Fields"
    }
    
    let cleanedPassword = passwordTextF.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let properGradeSelected = currentGradeTextF.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let validSchoolID = schoolIDTextF.text!.trimmingCharacters(in: .whitespacesAndNewlines)

    if Utilities.isPasswordValid(cleanedPassword) == false {
        
        showAlert(title: "Invalid Password", message: "Please ensure that your password contains 8 characters, contains a special character and a number as well.")
        return "Issue With Password"
    }
    
    if Utilities.isGradeValid(properGradeSelected) == false {
        showAlert(title: "Invalid Grade", message: "Please ensure that your current grade is valid.")
        return "Issue With Grade Input"
    }
    
    if Utilities.isSchoolIDValid(validSchoolID) == false {
        showAlert(title: "Invalid School ID Format", message: "The School ID entered has the incorrect format.")
        return "Issue With School ID input."
    }

    return nil
    
}

然后我在按下“注册”按钮时调用它,如下所示:

 @IBAction func signupPressed(_ sender: UIButton) {
    //Validate the fields
    let validationError = validateFields()
    
    if validationError != nil {
        return
    } else {
        //Create the user
        Auth.auth().createUser(withEmail: email, password: password) { (result, err) in ....

这很完美。现在,因为我想在函数中使用 Firestore 查询,所以我不能像在其他函数中那样返回 String 而不会出错,所以我对如何去做这件事感到很困惑。

这是我目前拥有的功能:

 func determineIfIDIsValid() {
    let schoolIDText = schoolIDTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
    db.collection("school_users").whereField("school_id", isEqualTo: schoolIDText).getDocuments { (querySnapshot, error) in
        guard error == nil else {
            return
        }
        guard let query = querySnapshot?.isEmpty else { return }
        if query == true {
            //Show error alert
        } else {
            return
           //Continue With Signup flow
        }
    }
}

我尝试在查询之前声明一个变量,无论是String 还是Bool,在查询之后更改值,并使用逻辑返回String,但这也不起作用。如何使用此函数验证特定字段而不会出现任何错误?

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore firebase-authentication


    【解决方案1】:
    func determineIfIDIsValid(_ callback: @escaping (Bool) -> ()) {
        let schoolIDText = schoolIDTextF.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
        db.collection("school_users").whereField("school_id", isEqualTo: schoolIDText).getDocuments { (querySnapshot, error) in
            guard error == nil else {
                return
            }
            guard let query = querySnapshot?.isEmpty else { return }
            if query == true {
                //Show error alert
                callback(true)
            } else {
                callback(false)
               //Continue With Signup flow
            }
        }
    }
    

    Firebase 调用是异步的。你需要使用闭包

    determineIfIDIsValid() { res in 
    if res {
    //Show alert 
    
    } else {
    //Continue With Signup flow
    }
    

    【讨论】:

    • 谢谢,甚至不知道您可以制作这样的功能。 @Владимир Ковальчук
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2019-05-27
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多