目录
1、输入框只能输入数字、字母和中文,不能输入特殊字符、表情和不包括空格;
4、金额的输入框限制只能输入一位小数点,小数点后保留2位小数,控制最多输入12位数字
1、输入框只能输入数字、字母和中文,不能输入特殊字符、表情和不包括空格;
思路:在输入的过程中,判断当前输入的文字是不是数字、字母和中文,因为特殊字符的范围很大,所以只控制输入的是满足条件的即可。
代码:在String的extension中添加下面方法
// 注意: 因为考虑到输入习惯,许多人习惯使用九宫格,这里在正常选择全键盘输入错误的时候,进行九宫格判断,九宫格对应的是下面➋➌➍➎➏➐➑➒的字符
/// 如果是数字、字母或者中文则返回true,其他返回false
func isLetterNumberAndChinese() -> Bool {
let pattern = "^[a-zA-Z\\u4E00-\\u9FA5\\d]*$"
let pred = NSPredicate(format: "SELF MATCHES %@", pattern)
let isMatch = pred.evaluate(with: self)
if !isMatch {
let other = "➋➌➍➎➏➐➑➒" // 九宫格输入法的字符
let len = self.count
for i in 0..<len {
let tmpStr = self as NSString
let tmpOther = other as NSString
let c = tmpStr.character(at: i)
if !((isalpha(Int32(c))) > 0 || (isalnum(Int32(c))) > 0 || ((Int(c) == "_".hashValue)) || (Int(c) == "-".hashValue) || ((c >= 0x4e00 && c <= 0x9fa6)) || (tmpOther.range(of: self).location != NSNotFound)) {
return false
}
return true
}
}
return isMatch
}
textField的代码调用:在代理方法中添加判断即可
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// 只能输入数字字母和英文
if string.isLetterNumberAndChinese() {
return true
}else {
return false
}
}
textView的代码调用:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// 只能输入数字字母和英文
if text.isLetterNumberAndChinese() {
return true
}else {
return false
}
}
2、控制输入的字符数量,例如只能输入11个字符
// textView 控制输入字符
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
guard let textStr = textView.text else { return true }
let fullStr = (textStr as NSString).replacingCharacters(in: range, with: text)
// 控制字数为11位
if fullStr.count > 11 {
return false
}else{
return true
}
}
// textField 另一种方式控制输入字符
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text {
let count = text.count + string.count - range.length
return count <= 11
}else {
return true
}
}
3、仅控制不能输入表情
String的分类中添加方法
// 判断是否包含emoji
func hasContainsEmoji()->Bool{
for scalar in unicodeScalars {
switch scalar.value {
case 0x1F600...0x1F64F,
0x1F300...0x1F5FF,
0x1F680...0x1F6FF,
0x2600...0x26FF,
0x2700...0x27BF,
0xFE00...0xFE0F:
return true
default:
continue
}
}
return false
}
/// 判断是不是Emoji
///
/// - Returns: true false
func hasEmoji()->Bool {
let pattern = "[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"
let pred = NSPredicate(format: "SELF MATCHES %@",pattern)
return pred.evaluate(with: self)
}
// 方法的调用
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// 控制表情
if text.isNineKeyBoard() {
return true
}else{
if text.hasEmoji() || text.hasContainsEmoji() {
return false
}
}
if textView.textInputMode?.primaryLanguage == "emoji" || ! ((textView.textInputMode?.primaryLanguage) != nil) {
return false
}
return true
}
4、金额的输入框限制只能输入一位小数点,小数点后保留2位小数,控制最多输入12位数字
// 控制最多输入12位数字,且只能输入一个小数点,小数点后只能输入2位数字
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text {
let textLength = text.count + string.count - range.length
if textLength > 12 {
return false
}
// 只能输入一位小数点
if text.contains(".") {
if string == "." {
return false
}
// 限制小数点后只能输入2位
if let decimalPlace = (text+string).components(separatedBy: ".").last {
if decimalPlace.count > 2 {
return false
}
}
}
// 小数点不能是第一位
if range.location == 0 && string == "." {
return false
}
return textLength <= 12
}
return true
}
本文详细介绍了如何在Swift中限制输入框的内容,包括只允许输入数字、字母和中文,控制字符数,阻止表情输入,以及实现金额输入框的特殊限制,确保小数点后最多两位,总位数不超过12位。

被折叠的 条评论
为什么被折叠?



