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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当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
}

当我在两个字段中键入然后我删除我在其中一个字段中键入的内容时,会出现问题。正如您在下图中看到的那样,按钮仍然处于启用状态。如果我在另一个(非空)文本字段中开始编辑,它将再次被禁用。

enter image description here

我的问题是如何在删除我在任何文本字段中输入的内容之后直接再次禁用该按钮才移动到另一个文本区域?

答案

在从委托中返回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
}
另一答案

试试这个...最初禁用你的登录按钮..

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

快乐编码:)

另一答案
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中添加相同的代码,它将工作:)

以上是关于当textfield为空时禁用按钮等待其他文本字段中的任何更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在对话框中将事件侦听器绑定到JavaFX TextFields。当字段为空时,“确定”按钮将被禁用,反之亦然

当文本字段为空时禁用警报按钮 Swift 3

TextField为空时如何禁用Button?

仅当特定输入为空时,如何禁用按钮?

当 1 个或多个 TextBox 字段为空时禁用按钮

AngularJS:输入字段为空时禁用按钮