开发中,限制字符串输入的内容是一个非常常见的需求。有的字符串只能输入数字,有的只能输入汉字,而有的又只能输入英文。简单的封装一个TextField来满足针对TextField的使用需求。
代码:
class XYField: UITextField {
var maxLenght: Int = 10
var rule: String = "[0-9]" //默认只是数字
override init(frame: CGRect) {
super.init(frame: frame)
addNotification()
}
//添加监听
func addNotification() {
NotificationCenter.default.addObserver(self, selector: #selector(textFieldTextChanged(sender:)), name: NSNotification.Name("UITextFieldTextDidChangeNotification"), object: self)
}
//内容改变时通知响应
@objc func textFieldTextChanged(sender: Notification) {
/**
输入中文拼音时会有markText
只有当markText为空时才能对Field的text进行筛选处理
*/
guard let _ = self.markedTextRange else {
//需要获取当前光标的位置 后面筛选操作后需要进行修改
let cursorP = self.offset(from: self.endOfDocument, to: self.selectedTextRange!.end)
//进行字符串筛选的正则表的式 需要上网搜自己需要的筛选规则正则表达式
var str = self.stringIsMyNeed(str: self.text!, rule: rule)
//textField控制字数限制
if str.count > maxLenght {
str = String(str.prefix(maxLenght))
}
self.text = str
//进行光标位置调整
let newCursorP = self.position(from: self.endOfDocument, offset: cursorP)!
self.selectedTextRange = self.textRange(from: newCursorP, to: newCursorP)
return
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//进行筛选
func stringIsMyNeed(str: String, rule: String) -> String {
var tempStr = str
var i: Int = 0
while i < tempStr.length {
let s = tempStr[i]
let count = s.length
//以键盘只能输入数字为例子
//判断当字符串出现不为数字的字符时用 "" 进行代替
if !(isNeed(str: s, rule: rule)) {
let startIndex = tempStr.index(tempStr.startIndex, offsetBy: i)
let endIndex = tempStr.index(startIndex, offsetBy: count)
let range = startIndex..<endIndex
tempStr.replaceSubrange(range, with: "")
i -= count
}
i += count
}
return tempStr
}
//判断字符串中的字符是否符合规则
func isNeed(str: String, rule: String) -> Bool {
let regx = try! NSRegularExpression(pattern: rule, options: [])
let count = regx.numberOfMatches(in: str, options: [], range: NSMakeRange(0, str.count))
if count >= 1 {
return true
} else {
return false
}
}
deinit {
NotificationCenter.default.removeObserver(self, name: NSNotification.Name("UITextFieldTextDidChangeNotification"), object: self)
}
}
//进行筛选字符串
extension String {
/// String使用下标截取字符串
/// string[index] 例如:"abcdefg"[3] // c
subscript (i:Int)->String{
let startIndex = self.index(self.startIndex, offsetBy: i)
let endIndex = self.index(startIndex, offsetBy: 1)
return String(self[startIndex..<endIndex])
}
var length: Int {
return self.count
}
}
代码中 rule 为正则表达式
针对不同输入内容要求需要相对应的正则表达式
下面提供一些要求的正则
- [0-9] 纯数字
- [A-Za-z] 英文
- [\u4e00-\u9fa5] 中文
- [\p{P}\p{Z}+=^~<>$¥] 标点