ios - 逐个删除字符后判断UITextfield是否为空

标签 ios swift3

我有一个带有两个 UITableViewCells 的 View Controller ,每个单元格都包含一个 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。

最佳答案

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

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

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

    之后您可以检查if (newString.isEmpty)

关于ios - 逐个删除字符后判断UITextfield是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42284292/

相关文章:

objective-c - 使用 Storyboard时重用 UIViewController 实例

swift - 如何防止 boolean 值在 if 语句中被覆盖?

arrays - 循环总是返回最后一张图片

ios - 生成具有给定分布的随机数

ios - 调整 UITable/Cell 宽度

ios - 图形 - 在缓冲区之间混合而不用考虑首先渲染哪个缓冲区

ios - 在后台快速播放音频播放列表

ios - 使用 Swift 3 解析 JSON 响应

ios - 从 firebase 控制台发送消息的正确 token 格式是什么?

ios - 如何在 swift 中创建一个 UIView 单例?