在函数文本字段中,第二部分(以'let ...'开头)通过在尝试将多个小数点输入到文本字段中时找到完美的表现,并且在Textfield中不允许将小数点显示超过一个小数点。
问题在于第一部分。在这里,它试图首先找到是否已键入字母字符。它确实认识到这种情况,然后退出返回" false"。
与代码的重复小数查找部分不同,文本字段显示不良字符而不是跳过。
也许我不明白这种委派方法的目的。我虽然该方法以某种方式返回false时,它会防止该字符被添加到TextField Display中。
func textField(_ textField:UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
for scalar in (textField.text?.unicodeScalars)! {
if NSCharacterSet.letters.contains(scalar) {
print("letter scalar found: (scalar.value), false")
return false
}
}
let existingTextHasDecimalSeperator = textField.text?.range(of: ".") // search textField for '.', can be 'nil'
let replacementTextHasDecimalSeperator = string.range(of: ".") // next character is '.', can be 'nil'
if existingTextHasDecimalSeperator != nil, replacementTextHasDecimalSeperator != nil {
return false
} else {
return true
}
}
这是因为您正在搜索现有的textfield.text,而不是alpha字符的新字符( replacementString
)。
将(textField.text?.unicodeScalars)!
更改为string.unicodeScalars
,您应该设置。
func textField(_ textField:UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
for scalar in string.unicodeScalars {
if NSCharacterSet.letters.contains(scalar) {
print("letter scalar found: (scalar.value), false")
return false
}
}
let existingTextHasDecimalSeperator = textField.text?.range(of: ".") // search textField for '.', can be 'nil'
let replacementTextHasDecimalSeperator = string.range(of: ".") // next character is '.', can be 'nil'
if existingTextHasDecimalSeperator != nil, replacementTextHasDecimalSeperator != nil {
return false
} else {
return true
}
}
将搜索从Textfield替换为字符串的建议!这是有效的Swift 3.0版本的列表。