懶加載控件
//昵稱
fileprivate lazy var nameTextfield:UITextField = {
let nameTextfield = UITextField()
nameTextfield.textColor = cmColorWithString(colorName: "666666")
nameTextfield.font = UIFont.systemFont(ofSize: 13)
nameTextfield.textAlignment = .right
nameTextfield.delegate = self
return nameTextfield
}()
添加通知
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
NotificationCenter.default.addObserver(self, selector: #selector(TextDidChange), name: NSNotification.Name.UITextFieldTextDidChange, object: nil)
}
TextDidChange方法
func TextDidChange(){
let str = nameTextfield.text
if !self.isInputRuleAndBlank(str: str!){
nameTextfield.text = self.disable_emoji(str: str!)
}
let lang = nameTextfield.textInputMode?.primaryLanguage
if lang == "zh-Hans"{
let selectedRange = nameTextfield.markedTextRange
if let _ = selectedRange{
}else{
let getStr = self.getSubString(str: str!)
if getStr != "" && getStr.characters.count>0{
nameTextfield.text = getStr
}
}
}else{
let getStr = self.getSubString(str: str!)
if getStr != "" && getStr.characters.count>0{
nameTextfield.text = getStr
}
}
}
TextField代理方法
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if self.isInputRuleNotBlank(str: string) || string == ""{
return true
}else{
return false
}
}
* 字母晒屎、數(shù)字沮稚、中文正則判斷(包括空格)(在系統(tǒng)輸入法中文輸入時會出現(xiàn)拼音之間有空格刁憋,需要忽略隔躲,當按return鍵時會自動用字母替換铅歼,按空格輸入響應(yīng)漢字)
*/
func isInputRuleAndBlank(str:String)->Bool{
let pattern = "^[a-zA-Z\\u4E00-\\u9FA5\\d\\s]*$"
let pred = NSPredicate(format: "SELF MATCHES %@", pattern)
let isMatch = pred.evaluate(with: str)
return isMatch
}
```
/**
* 過濾字符串中的emoji
*/
func disable_emoji(str:String)->String{
let regex = try!NSRegularExpression.init(pattern: "[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]", options: .caseInsensitive)
let modifiedString = regex.stringByReplacingMatches(in: str, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSRange.init(location: 0, length: str.characters.count), withTemplate: "")
return modifiedString
}
/**
* 字母、數(shù)字学搜、中文正則判斷(不包括空格)
*注意: 因為考慮到輸入習慣,許多人習慣使用九宮格,這里在正常選擇全鍵盤輸入錯誤的時候,進行九宮格判斷,九宮格對應(yīng)的是下面????????的字符
*/
func isInputRuleNotBlank(str:String)->Bool{
let pattern = "^[a-zA-Z\\u4E00-\\u9FA5\\d]*$"
let pred = NSPredicate(format: "SELF MATCHES %@", pattern)
let isMatch = pred.evaluate(with: str)
if !isMatch{
let other = "????????"
let len = str.characters.count
for i in 0..<len{
let tmpStr = str 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: str).location != NSNotFound)) {
return false
}
return true
}
}
return isMatch
}
/**
* 獲得 CharacterCount長度的字符
*/
func getSubString(str:String) -> String{
if str.characters.count>15{
self.view.ShowMbProgressHUD(message: "最多輸入15個字")
return str[0..<(15)]
}
return str
}
截取字符串擴展
extension String {
subscript (r: Range<Int>) -> String {
get {
let startIndex = self.index(self.startIndex, offsetBy: r.lowerBound)
let endIndex = self.index(self.startIndex, offsetBy: r.upperBound)
return self[Range(startIndex..<endIndex)]
}
}
}