XZ_Swift 之输入框的各种限制,看这一篇就够了:输入框只能输入字母、数字和中文,控制输入特殊字符和表情

本文详细介绍了如何在Swift中限制输入框的内容,包括只允许输入数字、字母和中文,控制字符数,阻止表情输入,以及实现金额输入框的特殊限制,确保小数点后最多两位,总位数不超过12位。

目录

 

1、输入框只能输入数字、字母和中文,不能输入特殊字符、表情和不包括空格;

2、控制输入的字符数量,例如只能输入11个字符

3、仅控制不能输入表情

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
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值