zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

iOS 限制textField字节长度详解手机开发

ios字节手机开发 详解 限制 长度 TextField
2023-06-13 09:20:07 时间

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; 

}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/3333.html

服务器部署程序员系统优化网站设置运维