2017-02-16 75 views
0

我有一个视图控制器与两个UITableViewCells和每个单元格包含UITextField。在我的导航栏中,我有一个名为“保存”的右侧栏按钮,除非两个文本框都包含文本,否则该按钮将被禁用。保存按钮的默认状态被禁用。从禁用到启用的转换工作正常,但在其中一个文本框被清空时禁用按钮很困难。确定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,除非用户再次按下删除按钮,即使没有剩下要删除的东西。

回答

1

发生这种情况的原因是你在overridingshouldChangeCharactersIn()方法,该方法在实际字符被添加/删除之前被调用。因此,如果你想赶上用户删除最后一个字符的情况下,你有两个选择:

  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)后。

+0

除了'newString'没有'text'属性 - 它只是'newString.isEmpty'这个工作。 – Brosef

+0

哦,没错。对不起,错误!刚编辑我的答案! –

0

所以在textField中有两个字符。用户点击删除。 shouldChangeCharactersIn被调用。没有任何改变,textField.text?.count == 2.你返回true并且该字符被删除。用户再次点击删除。 shouldChangeCharactersIn再次被调用。此时最后一个字符还没有被删除,但textField.text?.count == 1这就是为什么textField.text?.isEmpty == false。在用户尝试再次编辑文本之前它不会是真实的。