有一个需求,限制输入字符的长度30个字符(中文1个字2个字符)
以前都是直接限制length的,但是length是不区分中文和英文的,中文一个字length也是1。现在的需求肯定不能直接判断length了。
网上找了一下,这个可以通过计算ASCII码来实现。大概就是循环遍历字符串长度,按照length来取值。判断这个值在不在ASCII的范围内,在的话就是1个字节,不在就是Unicode编码2个字节。
+ (NSUInteger)textLength:(NSString *)text{
NSUInteger asciiLength = 0;
for (NSUInteger i = 0; i < text.length; i++) {
unichar uc = [text characterAtIndex: i];
asciiLength += isascii(uc) ? 1 : 2;
}
NSUInteger unicodeLength = asciiLength;
return unicodeLength;
}
这里还被坑了一下:UITextField不要使用delegate方式来监听用户输入的文字长度!!!
UITextField继承自UIControl有3种方式来监听,addTarget,或者delegate,或者系统的通知(UITextFieldTextDidChangeNotification等)。
每次我都是用代理来做东西,其实这里使用addTarget或者系统的通知更合适。我们可以直接拿到改变后的文字。判断长度,超过就直接截取最大长度就可以了。delegate拿不到每次改变的最终状态。
通过- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
方法要考虑的情况实在太多了,这个还需要考虑emoji表情等等,还要考虑输入法是啥。总之就是限制30个字符,最后的几个字节容易出问题,可能多了一个,或者多了好几个,导致状态判断不对。也可能是少了几个,因为原先可能已经是29个了,再输入一个汉字,就是31个字符了。。。。。。各种情况考虑,不如用addTargrt方式,直接拿到最终的字符串,直接截取
注意:UITextField是不可以换行的,文字只有一行
网友评论