【问题标题】:Disabling button when textfield is empty wait for any change in other textfield当文本字段为空时禁用按钮等待其他文本字段中的任何更改
【发布时间】:2018-09-06 09:25:22
【问题描述】:

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

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
}

当我在两个字段中输入然后我删除我在其中一个字段中输入的内容时,就会出现问题。如下图所示,该按钮仍处于启用状态。只有在我开始在另一个(非空)文本字段中编辑时,它才会再次被禁用。

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

【问题讨论】:

  • 这一切都是因为您没有考虑函数中的“字符串”值。要获取新字符串,您需要从 textfield.text 中添加/删除它。这应该对您有所帮助。

标签: swift uitextfield textfield disable


【解决方案1】:

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

【讨论】:

  • 你能解释更多关于action(addTarget)的细节吗?在哪里添加它以及如何使用它??
  • 您可以使用 Interface Builder 进行设置,或者将其添加到您的 viewDidLoad 中。以下是有关目标-动作模式的更多信息:developer.apple.com/library/archive/documentation/General/…
  • 我现在知道了,我不知道 textfield 也可以有行动,不仅是出口。
  • @MichałKwiecień 这真是很有创意的方式,我会投票赞成 :)
【解决方案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;
        }
    }

编码愉快:)

【讨论】:

  • 我认为它也会有所帮助,我使用文本字段上的操作来解决它(编辑更改时)。
【解决方案3】:
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 即可:)

【讨论】:

  • 它改进了一点,因为一旦我移动到另一个文本字段(在我编辑该文本字段之前)它会禁用按钮。但我的主要问题还是一样。一旦用户删除他的文本,甚至在他移动到另一个 texfield 之前,我想禁用该按钮。
  • @MinaHanna TRY 现在我已经按照你的要求更新了我的代码 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多