zoukankan      html  css  js  c++  java
  • 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)
        }
       
    }
    

      

  • 相关阅读:
    项目遇到的坑
    知乎贺老live
    cookie
    Vue之不常注意的点
    移动端适配问题
    ubuntu之nginx的安装
    Http相关笔记
    如何使用Augury检查Angular 8中的延迟加载
    Serilog——一个集成了。net应用程序的优秀日志框架
    引导HTML助手
  • 原文地址:https://www.cnblogs.com/huangzhenwei/p/9761246.html
Copyright © 2011-2022 走看看