在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在开发过程中,我们经常遇到这样的需求,需要对textField的输入做限制(限制只能输入中文,英文,数字),如果是英文和数字还简单些,中文的话大家做的时候可能就会发现问题了,如果我们使用shouldChangeCharacters处理的话是无法实现的,因为输入法输入中文的时候会首先把输入的拼音(叫做:marked text)显示在输入框中,然后点击键盘候选区的中文之后才会把中文显示在textfield中。
这时我们就不能使用这种方法了,我们要监听textField的UITextFieldTextDidChangeNotification来实现,这种方法实现的基本思路: 1.先判断当前是否有 markedtext,有的话我们不做任何动作。 2.使用正则过滤掉 textField 里非中文的字符,然后再将结果重新赋给 textField。 3.进行上面操作前要记下光标的位置,在赋值后再还原光标位置。否则如果在中间输入文字后,光标会自动跳到末尾。
// // ViewController.swift // // // Created by 黄镇威 on 2018/1/9. // Copyright © 2018年 黄镇威. All rights reserved. // import UIKit class ViewController: UIViewController { //文本输入框 var textField:UITextField! override func viewDidLoad() { super.viewDidLoad() //初始化文本输入框 textField = UITextField(frame: CGRect(x:20, y:100, width:200, height:30)) textField.borderStyle = .roundedRect self.view.addSubview(textField) } override func viewDidAppear(_ animated: Bool) { //监听textField内容改变通知 NotificationCenter.default.addObserver(self, selector: #selector(self.greetingTextFieldChanged), name:NSNotification.Name(rawValue:"UITextFieldTextDidChangeNotification"), object: self.textField) } //textField内容改变通知响应 @objc func greetingTextFieldChanged(obj: Notification) { //非markedText才继续往下处理 guard let _: UITextRange = textField.markedTextRange else{ //当前光标的位置(后面会对其做修改) let cursorPostion = textField.offset(from: textField.endOfDocument, to: textField.selectedTextRange!.end) //判断非中文的正则表达式 let pattern = "[^\\u4E00-\\u9FA5]" // 非中文:[^\\u4E00-\\u9FA5] // 非英文:[^A-Za-z] // 非数字:[^0-9] // 非中文或英文:[^A-Za-z\\u4E00-\\u9FA5] // 非英文或数字:[^A-Za-z0-9] //替换后的字符串(过滤调非中文字符) var str = textField.text!.pregReplace(pattern: pattern, with: "") //限制文字长度不能超过10个 if str.count > 10 { str = String(str.prefix(10)) } textField.text = str //让光标停留在正确位置 let targetPostion = textField.position(from: textField.endOfDocument, offset: cursorPostion)! textField.selectedTextRange = textField.textRange(from: targetPostion, to: targetPostion) return } } override func viewDidDisappear(_ animated: Bool) { //移除textField内容改变通知监听 NotificationCenter.default.removeObserver(self, name:NSNotification.Name(rawValue: "UITextFieldTextDidChangeNotification"), object: self.textField) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } extension String { //使用正则表达式替换 func pregReplace(pattern: String, with: String, options: NSRegularExpression.Options = []) -> String { let regex = try! NSRegularExpression(pattern: pattern, options: options) return regex.stringByReplacingMatches(in: self, options: [], range: NSMakeRange(0, self.count), withTemplate: with) } }
|
请发表评论