iOS 12 Рекомендуемый обратный вызов делегата текстового поля с надежным паролем для выбора собственного пароля - PullRequest
0 голосов
/ 01 декабря 2018

В iOS 12 у меня есть новое текстовое поле пароля для потока регистрации, и я хочу, чтобы система предложила надежное.У меня также есть кнопка, которая включает и отключает на основе метода делегата, и я делаю некоторые изменения и т. Д.

textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String)

Это хорошо работает для включения, когда пользователь нажимает Use Strong Password.Но мне кажется, что я не получаю обратный вызов делегата, когда пользователь может нажать Choose My Own Password, и в результате моя логика кнопки включения / выключения никогда не получает возможности выполнить, позволяя кому-то зарегистрироваться с пустым паролем.

Suggested password

Есть идеи о том, что я мог бы сделать, чтобы получить обратный вызов, когда пользователь нажимает Choose my own password?Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я столкнулся с той же проблемой, но единственной вещью, которую я обнаружил, было предоставление обратных вызовов, был viewDidLayoutSubviews делегат UIView

Итак, я использовал это:

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        if passwordTextField.isFirstResponder {
           validatePassword(passwordTextField.text ?? "")
        }
    }
0 голосов
/ 02 декабря 2018

Я не знаком с делегатом по «Использовать пароль строки», но если пользователь выбирает свой собственный пароль, вам необходимо проверить, что пользователь вводит в текстовом поле пароля, и убедиться, что он соответствует вашим критериям.

Для этого вам нужно проверить, что введено в текстовое поле пароля, используя его цель .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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...