在函数textField中,第二部分(以' let ...'开头)通过查找尝试将多个小数点输入textField来完美地执行,而不是允许在textField中显示多个小数点。
问题在于第一部分。在这里,它首先尝试查找是否键入了字母字符。它确实认识到发生了这种情况,然后退出了“假”。
与代码的重复小数查找部分不同,textField显示坏字符而不是跳过它。
也许我不明白这种委托方法是如何工作的。我虽然该方法以某种方式返回false,但它会阻止将该字符添加到textField显示中。
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
}
}
答案 0 :(得分:0)
这是因为您正在搜索现有的textField.text,而不是搜索字符的新字符(replacementString
)。
将(textField.text?.unicodeScalars)!
更改为string.unicodeScalars
,您应该设置。
答案 1 :(得分:0)
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版本列表。