在iOS 12中,我有一个用于注册流程的新密码文本字段,我希望系统建议一个强密码文本字段。我还具有一个基于委托方法启用和禁用的按钮,并且进行了一些更改等。
textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String)
当用户点击Use Strong Password
时,启用它很有用。
但是我似乎没有收到有关用户何时点击Choose My Own Password
的委托回调,因此我的按钮启用/禁用逻辑永远都没有执行的机会,允许某人使用空白密码进行注册。>
关于用户点击Choose my own password
时可能做些什么来获取回调的任何想法?任何帮助将不胜感激。
答案 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)}}/>