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

Ios 逐个删除字符后确定UITextfield是否为空,ios,swift3,Ios,Swift3,我有一个带有两个uitableviewcell的视图控制器,每个单元格包含一个UITextField。在我的导航栏中,我有一个名为“保存”的右栏按钮,除非两个文本字段都包含文本,否则该按钮将被禁用。保存按钮的默认状态为禁用。从禁用到启用的转换工作正常,但在其中一个文本字段为空时禁用按钮是很困难的 我目前正在做以下工作: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replace

我有一个带有两个
uitableviewcell
的视图控制器,每个单元格包含一个
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,除非用户再次按下delete按钮,即使没有要删除的内容

文本字段中有两个字符。用户点击删除。将调用shouldChangeCharactersIn。尚未更改任何内容,并且textField.text?.count==2。返回true,字符将被删除。用户再次点击删除。将再次调用shouldChangeCharactersIn。此时,最后一个字符尚未删除textField.text?.count==1,这就是textField.text?.isEmpty==false的原因。在用户再次尝试编辑文本之前,它不会为真

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

  • 您可以将
    if(textField.text?.isEmpty)
    替换为
    if(textField.text?.characters.count==1&&replacementString==“”)
  • 您还可以在
    if语句之前更新字符串,如下所示:

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)
    
    在此之后,您可以检查
    是否(newString.isEmpty)


  • 这就完成了任务,除了
    newString
    没有
    text
    属性-它只是
    newString.isEmpty
    。哦,是的。对不起,弄错了!刚刚编辑了我的答案!