swift - 当文本字段为空时禁用按钮等待其他文本字段中的任何更改
问题描述
如果电子邮件或密码文本字段为空,我想禁用登录按钮,并在两者都填写时再次启用它,因此我使用以下代码:
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
}
当我在两个字段中输入然后我删除我在其中一个字段中输入的内容时,就会出现问题。正如您在下图中看到的那样,该按钮仍然启用。如果我开始在另一个(非空)文本字段中进行编辑,它只会再次被禁用。
我的问题是如何在删除我在任何文本字段中输入的内容后直接再次禁用按钮,然后再移动到另一个?
解决方案
在从您的委托返回 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
}
推荐阅读
- mysql - UTF-8 在 MySQL DB 中存储为问号
- angular - 具有 OR 语句和文档相关身份验证数据的 Angular Firestore 权限
- r - R 使用指数回归方程
- c# - ObservableCollection 绑定没有按预期工作
- dart - 从当前版本升级到最新版本时出现错误
- square-connect - 轮询 Square Device 状态
- javascript - cavsTxt.measureText 根据字体系列和字体大小为文本提供不同的宽度
- python - 从 SparseTensorValue 访问值
- php - PHP:准备好的语句不能从单引号中转义
- sql - 以垂直方式显示Sing