iOS输入框过滤表情,处理自带键盘无法输入

本片分两部分

1、使用正则表达式过滤表情
2、处理苹果自带键盘无法输入汉字问题

先记录下,后面完善:

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        NotificationCenter.default.addObserver(self, selector: #selector(self.textFieldEditChanged(noti:)), name: Notification.Name.UITextFieldTextDidChange, object: self.inputTextField)
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        NotificationCenter.default.removeObserver(self, name: Notification.Name.UITextFieldTextDidChange, object: self.inputTextField)
    }

@objc fileprivate func textFieldEditChanged(noti: Notification) {
        
        guard let textField = noti.object as? UITextField else {
            return
        }
        
        // 有高亮的正在输入的字符,不做任何处理
        if let _ = textField.markedTextRange {
            return
        }
        
        guard let endRange = textField.selectedTextRange?.end else {
            return
        }
        
        guard let regexStr = self.stepType.inputRegex else {
            return
        }
        
        let cursorPositon = textField.offset(from: textField.endOfDocument, to: endRange)
        
        // 使用正则过滤字符串
        let resultStr = Utils.regularRepalce(regexStr, origin: textField.text ?? "")
        textField.text = resultStr
        
        if let targetPosition = textField.position(from: textField.endOfDocument, offset: cursorPositon) {
            textField.selectedTextRange = textField.textRange(from: targetPosition, to: targetPosition)
        }
        
    }

使用给定的正则匹配,不匹配的字符使用空串过滤

 /// 对给入的字符串进行正则,未匹配的使用相应的字符替换
    ///
    /// - Parameters:
    ///   - regexStr: 正则
    ///   - origin: 原始字符串
    ///   - template: 喜欢的字符串
    /// - Returns: 返回正则处理之后的字符串
    public static func regularRepalce(_ regexStr: String, origin: String, template: String = "") -> String {
        
        guard let regex = try? NSRegularExpression(pattern: regexStr, options: []) else {
            return origin
        }
        return regex.stringByReplacingMatches(in: origin, options: [], range: NSRange(location: 0, length: origin.count), withTemplate: template)
        
    }

我使用的正则
1、匹配所有非 空格大小写字母数字中文和下划线 -

"[^ A-Za-z0-9\\u4E00-\\u9FA5_-]"                  // 中英文空格_-,其他过滤
"[^A-Za-z0-9]"    // 非英文数字
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 23,002评论 4 46
  • 一、正则表达式的用途(搜索和替换) 1.1.正则表达式(regular expression,简称regex)是一...
    IIronMan阅读 10,148评论 0 14
  • 隐婚(3) 在一起的第一天似乎比小米想的要轻松和愉悦,无论是在床上还是在交谈,让她很清楚的感觉到,他在家里和在公司...
    苏琪说阅读 288评论 2 1
  • 你别看今年双十一天猫成交额1682亿,但是其中的难处只有商家们才能切身体会!淘宝也开始淘汰越来越多的人了... 有...
    程序员架构笔记阅读 460评论 0 1
  • 弘阳新开的一家 抹茶盆栽 不太好喝,感觉就跟上次喝的那什么没差
    菠00阅读 275评论 0 0