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, 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)
}
}

浙公网安备 33010602011771号