前言
最近在做一个项目,其中要求所有可以输入的输入框都要限制长度,一共要求是12个字符,就是说中文最多只能输入6个,英文,数字可以输入12个。因为之前没有接触过这个,所以在网上查了很多代码片段,按照方法实现之后,发现第一个问题,就是英文,数字,汉字都可以输入12个,明显是不对的,后来找到个新的方法,但是如果你要是使用键盘的联想输入的时候,会发现控制不了长度了,或者当输入一连串的话的时候,但是发现只剩一个字节的时候,会打不出来,所以我开始研究如何控制这个地方。
代码
1.首先注册通知
//注册通知,textfield内容改变调用
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.tf];
2.在通知方法中控制
//通知
- (void)textFieldDidChange:(NSNotification *)note
{
UITextRange *selectedRange = [_tf markedTextRange];
//获取高亮部分
UITextPosition *position = [_tf positionFromPosition:selectedRange.start offset:0];
// NSLog(@"%@", position);
if (!position) {
//获取文本框内容的字节数
int bytes = [self stringConvertToInt:self.tf.text];
//设置不能超过12个字节,因为不能有半个汉字,所以以字符串长度为单位。
if (bytes > 6)
{
//超出字节数,还是原来的内容
self.tf.text = self.lastTextContent;
}
else
{
self.lastTextContent = self.tf.text;
}
}else {
}
}
3./**
* 得到字节数
*
* @param strtemp 要获取字节的字符串
*
* @return 返回字节数+1的一半,因为不会有半个汉字
*/
- (int)stringConvertToInt:(NSString*)strtemp
{
int strlength = 0;
char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];
for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {
if (*p) {
p++;
strlength++;
}
else {
p++;
}
}
return (strlength+1)/2;
}
4.在textfiled的代理方法中,将textfile的原来的内容放在textfiled中
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
self.lastTextContent = _firstTf.text;
return YES;
}
获取高亮的部分 就是避免输入一串汉字的时候,不能输入。 参考的别人的代码,自己做了一下修改。实现了自己的需求,有什么错误,希望大家指正。