Swift-UITextField限制电话号码输入一些小细节

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

你可能感兴趣的:(Swift-UITextField限制电话号码输入一些小细节)