禁用文本字段中的字母字符(我的部分代码不会执行)

Disable Alphabetic Characters in a Text Field (Part of my code will not execute)

为了防止用户在文本字段中输入多于一位小数,并防止用户在文本字段中输入字母字符,我尝试了以下代码。问题是我不知道如何在函数中同时检查它们并且有两个 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
    }

}

你的函数不起作用的原因是它对正例和负例都提前做出了决定。

延迟返回 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

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

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
}

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

对于 swift 4 位用户,您可以删除嵌套在第一个条件中的 if replacementTextHasLetter != 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
}