我正在学习 iOS 开发,并试图阻止 UITextField 的值具有多个十进制值,例如“45.3.1”和字母字符。
阻止字母字符功能未按我的预期运行。如果我在文本字段中输入数字时打印 alphabeticString
我得到 nil
但是当我在输入诸如“a”之类的字符时打印 alphabeticString
我得到一个可选范围。出于某种原因,即使 alphabeticString
打印为 nil,我的 if 语句总是在插入字符时返回 true。
有什么原因吗?谢谢。
func textField(textField: UITextField,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String) -> Bool {
let existingTextHasDecimalSeperator = textField.text?.rangeOfString(".")
let replacementTextHasDecimalSeparator = string.rangeOfString(".")
let alphabeticString = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet())
if existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeparator != nil && alphabeticString != nil {
return false
}
else {
return true
}
}
最佳答案
嗯,我不确定为什么它不起作用。为什么不为您的 textfield
使用“Decimal Pad”键盘类型?
如果出于某种原因你不想这样做,试试这个:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
switch string {
case "0","1","2","3","4","5","6","7","8","9":
return true
case ".":
if let _ = textField.text?.rangeOfString("."){
return false
}else{
return true
}
default:
if let _ = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet()){
return false
}
return true
}
}
编辑:我想我在你的代码中发现了问题,你需要将 if
语句分成两个条件:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let existingTextHasDecimalSeperator = textField.text?.rangeOfString(".")
let replacementTextHasDecimalSeparator = string.rangeOfString(".")
let alphabeticString = string.rangeOfCharacterFromSet(NSCharacterSet.letterCharacterSet())
if (existingTextHasDecimalSeperator != nil && replacementTextHasDecimalSeparator != nil) || alphabeticString != nil {
return false
}
else {
return true
}
}
关于iOS Delegate 以防止无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37870049/