OC语言中,NSString类型的字符串,视英文字母和汉字都为一个长度(string.length把一个汉字也当作一个长度),而实际上,一个英文字母只占用1个字节,一个汉字占用2个字节。web
有时又有需求,须要限定字节数目,而不是内容个数,就须要经过一些方法获取到字符串的字节数。好比,限定10个字节,则最多能够输入10个英文字母,或者5个汉字。函数
监听textField的长度变化,就须要设置textField的代理。spa
可是有个bug,监听内容变化的代理方法代理
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
在点击键盘输入是正常的,但若是不点击键盘按键,拿汉字输入举例,输入一个字后,键盘上面会出现与该字多是词语的字,点上面出现的字来输入,就不会触发上面的代理方法。
code
因此这个代理方法不能用,咱们须要经过注册textField的通知来监听。orm
//注册通知,textfield内容改变调用 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:self.testTextField];
实现通知方法server
- (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一开始就有内容,就要获取到,用代理方法ci
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { self.lastTextContent = textField.text; return YES; }