Swift限制只能输入中文(粘贴无效),Swift限制输入字数

  在开发过程中,我们经常遇到这样的需求,需要对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, 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)
    }
   
}

  

原文地址:https://www.cnblogs.com/huangzhenwei/p/9761246.html