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