iOS 12建议选择我自己的密码的强密码文本字段委托回调

时间:2018-12-01 00:10:09

标签: ios swift uitextfield ios12

在iOS 12中,我有一个用于注册流程的新密码文本字段,我希望系统建议一个强密码文本字段。我还具有一个基于委托方法启用和禁用的按钮,并且进行了一些更改等。

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

当用户点击Use Strong Password时,启用它很有用。 但是我似乎没有收到有关用户何时点击Choose My Own Password的委托回调,因此我的按钮启用/禁用逻辑永远都没有执行的机会,允许某人使用空白密码进行注册。

Suggested password

关于用户点击Choose my own password时可能做些什么来获取回调的任何想法?任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但是我发现唯一提供回调的是viewDidLayoutSubviews的{​​{1}}委托

所以我要做的就是使用这个:

UIView

答案 1 :(得分:1)

iOS 13引入了新的委托方法

func textFieldDidChangeSelection(_ textField: UITextField) {

}

当强密码填写并删除时,将调用此密码。同样,它仅在iOS 13中可用。

在更改或清除文本时也会调用它,因此请注意,如果您正在调用shouldChangeCharactersIn或使用UIControl.Event.editingChanged添加了两种方法都会响应

答案 2 :(得分:0)

我不熟悉“使用字符串密码”的委托,但是如果用户选择自己的密码,则需要检查用户在密码textField中键入的内容并验证其是否符合您的条件。

为此,您需要使用目标.editingChanged来检查在密码textField中键入的内容。当用户键入内容时,它里面的任何内容都会启用或禁用该按钮。查看步骤3和步骤4。第4步将进行切换,并决定是否启用或禁用按钮。

要注意的另一件事是,当vc首次出现时,按钮应该为disabled,然后一旦密码textField数据有效,则启用按钮。步骤1和步骤4

例如,在我的应用程序中,如果用户在密码textField内的所有空白处输入,则会禁用signUp按钮,但如果他们输入有效数据,则将启用该按钮。

更新之后,我在步骤viewDidLoad中的步骤3A和3B中添加了@DawsonToth,因为如果用户选择了强密码,则@DawsonToth会在注释中正确指出,下一个按钮将被启用。但是,如果他们随后决定选择“选择我自己的密码”,则passwordTextField将清除,但仍然启用下一个按钮。我没有考虑。

您需要在passwordTextField的“文本” KVO observer上添加keypath,以便每次passwordTextField的文本更改更改时,都会调用handleTextInputChanged(),因此一旦清除文本,将禁用下一个按钮。 / p>

// 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
}

答案 3 :(得分:0)

我遇到了同样的问题。我所做的只是简单地计算文本字段的子视图。

if textField.subviews.count == 3 { } // Has suggested password

我在此签入

  @objc func textFieldDidChange(_ textField: UITextField)

答案 4 :(得分:0)

我遇到了同样的问题。

我通过监听onEndEditing事件来跳过它,以更新状态。

<Input value={this.state.val} 
  onChangeText={(val) => this.setState({val})} 
  secureTextEntry={true} 
  onEndEditing={(e)=>{this.setState({val : e.nativeEvent.text)}}/>