Я не знаком с делегатом по «Использовать пароль строки», но если пользователь выбирает свой собственный пароль, вам необходимо проверить, что пользователь вводит в текстовом поле пароля, и убедиться, что он соответствует вашим критериям.
Для этого вам нужно проверить, что введено в текстовое поле пароля, используя его цель .editingChanged
.По мере того, как пользователь вводит то, что идет внутрь, он либо включает, либо отключает кнопку.Посмотрите на шаг № 3 и шаг № 4.Шаг 4 - это то, что переключит и решит включить или отключить кнопку.
Еще одна вещь, на которую следует обратить внимание, это то, что, когда vc появляется впервые, кнопка должна быть disabled
, а затем, когда данные textField пароля будутдействительный, затем включите, затем кнопку.Шаг № 1 и Шаг № 4
Например, в моем приложении, если пользователь вводит все пустые места в текстовом поле пароля, кнопка регистрации будет отключена, но если они введут действительные данные, кнопка будет включена.
ОБНОВЛЕНИЕ Я добавил на шаге 3А и 3В в viewDidLoad
впоследствии, потому что, как @DawsonToth правильно указал в комментариях, если пользователь выбирает надежный пароль, следующая кнопка будет включена.Но если они затем решили выбрать «Выбрать мой собственный пароль», 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
}