用户登录
用户注册

分享至

IOS textField限制字节长度

  • 作者: 沙漠之鱼8185584
  • 来源: 51数据库
  • 2021-07-10

oc语言中,nsstring类型的字符串,视英文字母和汉字都为一个长度(string.length把一个汉字也当做一个长度),而实际上,一个英文字母只占用1个字节,一个汉字占用2个字节。

有时又有需求,需要限定字节数目,而不是内容个数,就需要通过一些方法获取到字符串的字节数。比如,限定10个字节,则最多可以输入10个英文字母,或者5个汉字。

监听textfield的长度变化,就需要设置textfield的代理。

但是有个bug,监听内容变化的代理方法

- (bool)textfield:(uitextfield *)textfield shouldchangecharactersinrange:(nsrange)range replacementstring:(nsstring *)string

在点击键盘输入是正常的,但如果不点击键盘按键,拿汉字输入举例,输入一个字后,键盘上面会出现与该字可能是词语的字,点上面出现的字来输入,就不会触发上面的代理方法。

所以这个代理方法不能用,我们需要通过注册textfield的通知来监听。

//注册通知,textfield内容改变调用
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(textfielddidchange:) name:uitextfieldtextdidchangenotification object:self.testtextfield];

实现通知方法

- (void)textfielddidchange:(nsnotification *)note{
uitextfield *textfield = note.object;
//获取文本框内容的字节数
int bytes = [self stringconverttoint:self.testtextfield.text];
//设置不能超过32个字节,因为不能有半个汉字,所以以字符串长度为单位。
if (bytes > 16)
{
//超出字节数,还是原来的内容
self.testtextfield.text = self.lasttextcontent;
}
else
{
self.lasttextcontent = self.testtextfield.text;
}
}
//得到字节数函数
- (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;
}

如果textfield一开始就有内容,就要获取到,用代理方法

- (bool)textfieldshouldbeginediting:(uitextfield *)textfield
{
self.lasttextcontent = textfield.text;
return yes;
}

以上所述是小编给大家介绍的ios textfield限制字节长度的相关内容,希望对大家有所帮助。

软件
前端设计
程序设计
Java相关