文本字段为空时禁用按钮等待其他文本字段中的任何更改

Disabling button when textfield is empty wait for any change in other textfield

如果电子邮件或密码文本字段为空,我想禁用登录按钮,并在两者都填满时再次启用它,所以我使用以下代码:

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
}

当我在两个字段中都输入内容然后删除我在其中一个字段中输入的内容时出现问题。正如您在下图中看到的,如果我在另一个(非空)文本字段中开始编辑,按钮仍然 enabled.It 只会再次被禁用。

我的问题是如何在删除我在任何文本字段中输入的内容后直接再次禁用该按钮,然后再移至另一个文本字段?

在从委托返回 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
}
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 中,它就会起作用:)

试试这个...首先禁用您的登录按钮..

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

编码愉快:)