首页 > 解决方案 > 当文本字段为空时禁用按钮等待其他文本字段中的任何更改

问题描述

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

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
}

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

在此处输入图像描述

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

标签: swiftuitextfieldtextfielddisable

解决方案


在从您的委托返回 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
}

推荐阅读