我不熟悉“使用字符串密码”的委托,但如果用户选择自己的密码,您需要检查用户在密码文本字段中输入的内容并验证它是否符合您的条件。
为此,您需要使用目标.editingChanged 检查在密码文本字段中输入的内容。当用户键入其中的任何内容时,将启用或禁用该按钮。查看第 3 步和第 4 步。第 4 步将切换并决定启用或禁用按钮。
要注意的另一件事是,当 vc 首次出现时,按钮应为disabled,然后一旦密码 textField 数据有效,然后启用按钮。第 1 步和第 4 步
例如,在我的应用程序中,如果用户在密码文本字段内的所有空格中输入,则注册按钮将被禁用,但如果他们输入有效数据,则该按钮将被启用。
更新我随后在viewDidLoad 的步骤 3A 和 3B 中添加,因为正如 @DawsonToth 在 cmets 中正确指出的那样,如果用户选择了强密码,则将启用下一步按钮。但是,如果他们随后决定选择选择我自己的密码,passwordTextField 将清除,但仍会启用下一个按钮。我没有考虑到这一点。
您需要将KVO observer 添加到passwordTextField 的“文本”keypath 中,这样每次passwordTextField 的文本更改时都会调用handleTextInputChanged(),从而在清除文本后禁用下一个按钮。
// 1. create a signUp button and make sure it is DISABLED and the color is .lightGray to signify that. In step 4 if the data inside the passwordTextField is valid I enable then button and change the color to blue
let signUpButton: UIButton = {
let button = UIButton(type: .system)
button.isEnabled = false // ** this must be set as false otherwise the user can always press the button **
button.setTitle("SignUp", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.backgroundColor = UIColor.lightGray
button.addTarget(self, action: #selector(signUpButtonTapped), for: .touchUpInside)
return button
}()
// 2. create the password textField and set its delegate in viewDidLoad. For eg self.passwordTextField.delegate = self
let passwordTextField: UITextField = {
let textField = UITextField()
textField.placeholder = "Enter Password"
textField.autocapitalizationType = .none
textField.returnKeyType = .done
textField.isSecureTextEntry = true
// 3. add the target for .editingChanged to check the textField
textField.addTarget(self, action: #selector(handleTextInputChanged), for: .editingChanged)
return textField
}()
override func viewDidLoad() {
super.viewDidLoad()
passwordTextField.delegate = self // if this is programmatic make sure to add UITextFieldDelegate after the class name
// 3A. Add a KVO observer to the passwordTextField's "text" keypath
passwordTextField.addObserver(self, forKeyPath: "text", options: [.old, .new], context: nil)
}
// 3B. call the observer
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "text" {
handleTextInputChanged()
}
}
// 4. this checks what's typed into the password textField from step 3
@objc fileprivate func handleTextInputChanged() {
let isFormValid = !isPasswordTextFieldIsEmpty() // if the textField ISN'T empty then the form is valid
if isFormValid {
signUpButton.isEnabled = true
signUpButton.backgroundColor = .blue
} else {
signUpButton.isEnabled = false
signUpButton.backgroundColor = .lightGray
}
}
// 5. create a function to check to see if the password textField is empty
func isPasswordTextFieldIsEmpty() -> Bool {
// 6. this checks for blank space
let whiteSpace = CharacterSet.whitespaces
// 7. if the passwordTextField has all blank spaces in it or is empty then return true
if passwordTextField.text!.trimmingCharacters(in: whitespace) == "" || passwordTextField.text!.isEmpty {
return true
}
return false // if it has valid characters in it then return false
}
// 8. target method from step 1
@objc func signUpButtonTapped() {
// run firebase code
}