禁用文本字段中的字母字符(我的部分代码将无法执行)

时间:2016-08-08 22:05:49

标签: ios swift delegation

为防止用户在文本字段中输入多个小数,并阻止用户在文本字段中输入字母字符,我尝试了下面的代码。问题是我不知道如何在函数内检查它们并且有两个If语句,这意味着第二个语句将不会运行,因为它永远不会被执行。如果我拿出检查小数位数的代码并保留字符检查器代码就可以完美地运行。我怎么能让它们都工作呢?

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

    let existingTextHasDecimalSeparator = textField.text?.rangeOfString(".")
    let replacementTextHasDecimalSeparator = string.rangeOfString(".")

    let charactersNotAllowed = NSCharacterSet.letterCharacterSet()
    let replacementTextHasLetter = string.rangeOfCharacterFromSet(charactersNotAllowed)

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

    if replacementTextHasLetter != nil {
        return false
    } else {
        return true
    }

}

3 个答案:

答案 0 :(得分:1)

你的功能不起作用的原因是它对正面和负面情况做出了早期决定。

true返回到函数的最后:

if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
    // Do not allow multiple decimal separators
    return false
}
if replacementTextHasLetter != nil {
    // Do not allow letters
    return false
}
return true

这反映了决策的全有或全无的逻辑:所有检查必须成功才能进行所有检查,而只需要一次检查失败以拒绝更改。

答案 1 :(得分:1)

对于迅速的4个用户,您可以删除嵌套在第一个条件中的if replaceTextHasLetter!= nil条件以及else条件,并且代码也可以正常工作:

 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
}

答案 2 :(得分:0)

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{
    if replacementTextHasLetter != nil{
        return false
    }
    return false
} else {
    if replacementTextHasLetter != nil{
        return false
    }
    return true
}

可以像上面那样改进,但这就是我的应用程序不允许多个小数和字符的方式。它有效。