如果电子邮件或密码文本字段为空,我想禁用登录按钮,并在两者都填写后再次启用它,所以我使用以下代码:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if txtEmail.text != "" , txtPassword.text != "" {
btnLogInOutlet.isEnabled = true
}else if txtEmail.text! == "" || txtPassword.text! == "" {
btnLogInOutlet.isEnabled = false
}
return true
}
当我在两个字段中键入然后删除在其中一个字段中键入的内容时,就会出现问题。如下图所示,该按钮仍处于启用状态。只有在我开始在另一个(非空)文本字段中进行编辑时,该按钮才会再次变为禁用状态。
我的问题是,在删除我在任何文本字段中键入的内容之前,如何直接禁用按钮?
答案 0 :(得分:2)
您正在从文本字段中获取文本值,然后再从委托中返回true-这意味着它在更改之前具有旧值。
使用动作(您也可以使用情节提要进行挂钩),而不是使用shouldChangeCharactersIn
委托方法:
txtEmail.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
txtPassword.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
现在,在textFieldDidChange(textField: UITextField)
方法中,您可以复制粘贴您的实现(此处略有改进):
@objc func textFieldDidChange(textField: UITextField) {
btnLogInOutlet.isEnabled = !txtEmail.text.isEmpty && !txtPassword.text.isEmpty
}
答案 1 :(得分:2)
尝试此操作...最初会禁用您的登录按钮。
override func viewDidLoad() {
super.viewDidLoad()
loginbttn.isEnabled = false;
textfield1.addTarget(self, action: #selector(textFieldDidChange(_:)), for:.editingChanged )
textfield2.addTarget(self, action: #selector(textFieldDidChange(_:)), for:.editingChanged )
}
@objc func textFieldDidChange(_ sender: UITextField) {
if textfield1.text == "" || textfield2.text == "" {
loginbttn.isEnabled = false;
}else{
loginbttn.isEnabled = true;
}
}
快乐编码:)
答案 2 :(得分:0)
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if txtEmail.text != "" && txtPassword.text != "" {
btnlogin.isEnabled = true
}else if txtEmail.text! == "" || txtPassword.text! == "" {
btnlogin.isEnabled = false
}
return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
if txtEmail.text != "" && txtPassword.text != "" {
btnlogin.isEnabled = true
}else if txtEmail.text! == "" || txtPassword.text! == "" {
btnlogin.isEnabled = false
}
return true
}
您只需要在textFieldShouldEndEditing
中放入相同的代码,它就会起作用:)