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

时间:2018-09-06 09:25:23

标签: swift uitextfield textfield disable

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

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

我的问题是,在删除我在任何文本字段中键入的内容之前,如何直接禁用按钮?

3 个答案:

答案 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中放入相同的代码,它就会起作用:)