一
UITextField限制电话号码输入需要监听输入框,只是在这里分享下其中的小细节,监听输入变化有2种方法,一种是代理,一种是addTarget。
其中,addTarget直接获取到输入完成后的字符串,这里就不好控制是否要添加的问题,(其实可以遍历字符串中的字符去除掉其中的非数字,我没有用这种方法实现,如果有发现文章的,可以给我推荐下,学习下)。
所以我是在代理方法shouldChangeCharactersIn range中去处理,最后有完整代码
二、需要考虑的问题
1.删除动作
在点击键盘的删除时,代理返回的是当前光标选中的range,并且代理返回string是空字符串””
,在删除时就直接把textField的文字执行删除就行。
2.判断是否有11位
这里要注意的是11位是原本textField
已有的字符串减去
代理返回的range.length
3.处理新添加的string
首先去除掉首尾的空格换行什么的,为什么会出现空格,应为需要考虑到用户是粘贴的操作
(可恶的用户),再判断是否是存数字,这些都能在网上找到相应的方法,就不多说了。判断都通过后再做字符串的添加。
4.判断是否是手机号
这位好心博主有现成的手机号正则判断
5.富文本处理
用户不想看到的是1xxxxxxxxxx
的样式,希望是这种1xx xxxx xxxx
就是富文本加点间距
6还原光标的位置
又有好心博主给出了扩展,不然按苹果爸爸的写要累死textField.selectedTextRange扩展
是不是很简单
下面是整体代码。没有做大量测试,如有发现什么问题请提出来。
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let attributedPhoneNo = textField.attributedText == nil ? NSMutableAttributedString(string: "") : NSMutableAttributedString(string: textField.attributedText!.string)
//是删除动作
if string == "" {
attributedPhoneNo.replaceCharacters(in: range, with: string)
}else {
//已经有11位
if attributedPhoneNo.length - range.length == 11 {
return false
}
//去除首尾空格
let appendString = string.trimmed
if appendString.isValidPureNumbers() {
attributedPhoneNo.replaceCharacters(in: range, with: string)
}else {
return false
}
}
//是否是手机号
if !attributedPhoneNo.string.isValidPhoneNo() {
// TODO: 不是手机号
}else {
}
if attributedPhoneNo.length > 3 {
attributedPhoneNo.addAttribute(NSAttributedString.Key.kern, value: 10, range: NSMakeRange(2, 1))
}
if attributedPhoneNo.length > 6 {
attributedPhoneNo.addAttribute(NSAttributedString.Key.kern, value: 10, range: NSMakeRange(6, 1))
}
textField.attributedText = attributedPhoneNo
//设置光标位置
textField.selectedRange = NSRange(location: range.location + string.count, length: 0)
return false
}
}
网友评论