在逐个删除字符后确定UITextfield是否为空

时间:2017-02-16 20:48:01

标签: ios swift3

我有一个带有两个UITableViewCells的视图控制器,每个单元格包含一个UITextField。在我的导航栏中,我有一个名为“保存”的右侧栏按钮,除非两个文本域都包含文本,否则它被禁用。保存按钮的默认状态被禁用。从禁用到启用的转换工作正常,但在其中一个文本字段清空时禁用按钮很困难。

我目前正在做以下事情:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if title == "Password"{
        if textField.tag == 1{
            if (textField.text?.isEmpty)!{
                passwordField1Empty = true
            }
            else {
                passwordField1Empty = false
            }
        }
        else if textField.tag == 2 {
            if (textField.text?.isEmpty)! {
                passwordField2Empty = true
            }
            else {
                passwordField2Empty = false
            }
        }

        if passwordField1Empty == false && passwordField2Empty == false {
            self.navigationItem.rightBarButtonItem?.isEnabled = true
        }
        else {
            self.navigationItem.rightBarButtonItem?.isEnabled = false
        }
    }
    else {
        self.navigationItem.rightBarButtonItem?.isEnabled = true
    }
    return true

}

导致问题的原因是,如果用户返回并逐个删除文本字段中的每个字符,则每次都会调用textField.text?.isEmpty。如果剩下最后一个字符textField.text?.isEmpty将在删除最后一个字符之前被调用,那么它最终会返回false。除非用户再次按下删除按钮,否则textField.text?.isEmpty将不会返回true,即使没有任何内容可以删除。

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您overriding方法是在添加/删除实际字符之前调用的shouldChangeCharactersIn()方法。因此,如果您想要捕获用户删除最后一个字符的情况,您有两个选项:

  1. 您可以将if (textField.text?.isEmpty)替换为if (textField.text?.characters.count == 1 && replacementString == "")
  2. 您也可以在if statement之前更新字符串:

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
    

    在此之后,您可以查看if (newString.isEmpty)

答案 1 :(得分:0)

因此textField中有两个字符。用户点击删除。 shouldChangeCharactersIn被调用。什么都没有改变,textField.text?.count == 2.返回true并删除字符。用户第二次点击删除。 shouldChangeCharactersIn再次被调用。此时最后一个字符尚未删除textField.text?.count == 1这就是textField.text?.isEmpty == false的原因。在用户再次尝试编辑文本之前,它不会成立。