源码下载: https://github.com/DMDavid/TextInputLimit
功能模板:
支付宝中在 ‘设置’ 界面昵称设置里,UITextField 是可以输入16个中文昵称,32个英文字符,包括emoji等其他文字。
编码
编码:Unicode中文占字符:2个英文占字符:1个emoji表情占:4个
编码:UTF-8中文占字符:3个英文占用:1个emoji表情占:4个
思路设计:
将textField.text转码,如果超过限制的编码,对编码进行截取,再转成String,赋值给textField将textField.text转码,如果超过限制的编码,通过substringToIndex:截取到文字length最后一个长度,继续进行判断,直到符合条件。
实现
1. 方法一:
![](https://i-blog.csdnimg.cn/blog_migrate/8121c8673ace5cbfd52d689310ad952b.webp?x-image-process=image/format,png)
问题:
用Unicode编码 NSUnicodeStringEncoding 时,中英文混合时,会出现英文也2个字符,这显然有问题。
用UTF-8编码 NSUTF8StringEncoding 时,不会出现问题,但中文是3个字符,而表情是4个,所以这个方法不是太满足条件,
舍弃
2. 方法二:
首先在NSString分类中添加分类方法byteLength,支付宝emoji表情处理是按2个字符的,所以我们采用第一种计算字符方法。
![](https://i-blog.csdnimg.cn/blog_migrate/679c6277a718caf417f71b81ec220b69.webp?x-image-process=image/format,png)
- 实现TextField代理方法:
textField: shouldChangeCharactersInRange: replacementString:
![](https://i-blog.csdnimg.cn/blog_migrate/80f00d979b9616af907380121c231b7d.webp?x-image-process=image/format,png)
和通知属性 :
![](https://i-blog.csdnimg.cn/blog_migrate/13211660f8729c8843ecaa0198b623c5.webp?x-image-process=image/format,png)
这里说明一下:
1.键盘输入的话会先调用 代理方法,然后调用通知。 (第三方键盘输入调用顺序相同)
2. 如果是系统键盘联想输入的话会调用通知,而代理方法不执行。
所以只需要同时实现这两个方法,来处理不同输入的情况。
代码实现:
![](https://i-blog.csdnimg.cn/blog_migrate/de06712dc35b069b63662843a32fa846.webp?x-image-process=image/format,png)
运行代码,一个一个输入没问题,实现了功能。但是,当使用第三方键盘输入超过textField限定最大的长度的时候,问题出现了,textField里面没有文字。 原因是,第三方键盘输入调用TextField代理方法,在判断上超过了指定的长度,return NO , 限制了textField的输入。
修改bug:
![](https://i-blog.csdnimg.cn/blog_migrate/afe2699d45204e4bee40eaaae5df75bd.webp?x-image-process=image/format,png)
再测试下,目前还没发现有什么bug,和支付宝的处理效果相同。