UITextFieldDelegate的shouldChangeCharactersIn方法 - 为什么不能组合检查两个小数分隔符和字母的条件语句

时间:2016-12-21 00:31:35

标签: swift uitextfielddelegate nscharacterset

为什么我的 replacementTextHasLetter 不会阻止我使用以下条件将字母粘贴到我的文本字段中?

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

    let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
    let replacementTextHasDecimalSeparator = string.range(of: ".")

    let charactersNotAllowed = NSCharacterSet.letters
    let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed)

    if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil && replacementTextHasLetter != nil {

        return false

    }

    return true

}

但是当它有自己独立的条件时,它有效吗?

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

    let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
    let replacementTextHasDecimalSeparator = string.range(of: ".")

    let charactersNotAllowed = NSCharacterSet.letters
    let replacementTextHasLetter = string.rangeOfCharacter(from: charactersNotAllowed)

    if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {

        return false

    }

    if replacementTextHasLetter != nil {

        return false

    }

    return true

}
编辑:我明白了。第一个例子是不可能的,因为 existingTextHasDecimalSeparator & replacementTextHasDecimalSeparator 基本上确定文本字段中是否有小数,如果用户尝试输入新的小数,则返回false。当我添加

&& replacementTextHasLetter != nil

到条件,它只是没有真正服务于一个目的,因为所有的陈述不能同时为真。谢谢@sonofabeach

1 个答案:

答案 0 :(得分:0)

这两行:

if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
    return false
}

if replacementTextHasLetter != nil {
    return false
}

实际上是否与:

相同
if (existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil) || replacementTextHasLetter != nil {
    return false
}

请注意,对于最后一个条件,请使用||代替&&