我有一个带有两个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,即使没有任何内容可以删除。
答案 0 :(得分:1)
这种情况正在发生,因为您overriding
方法是在添加/删除实际字符之前调用的shouldChangeCharactersIn()
方法。因此,如果您想要捕获用户删除最后一个字符的情况,您有两个选项:
if (textField.text?.isEmpty)
替换为if (textField.text?.characters.count == 1 && replacementString == "")
。您也可以在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的原因。在用户再次尝试编辑文本之前,它不会成立。