RedRain的简书:http://www.jianshu.com/users/29e03e6ff407/latest_articles
有时需要输入限定长度的文字数量.但是由于键盘的联想和粘贴会造成字数超出规定数.
在TextView中的代理方法处理一下超出的文字.就可以达到效果.
static NSInteger const kText_Length_MAX = 20;
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)atext{
if ((textView.text.length - range.length + atext.length) > kText_Length_MAX)
{
// 超出范围的文字, 截断到规定长度, 粘贴出现超出文字.
NSString *tempString = [NSString stringWithFormat:@"%@%@",textView.text,atext];
textView.text = tempString;
NSString * lastStr =[tempString substringWithRange:NSMakeRange(kText_Length_MAX, 1)];
// 如果这个字符是emoji的一部分,即无效的字符,那么这个就是nil
if(lastStr.UTF8String == nil){
NSInteger offset = tempString.length - kText_Length_MAX;
NSInteger length = offset > 0 ? offset : 0;
NSRange range = NSMakeRange(kText_Length_MAX+1 , length);
textView.selectedRange = range;
[textView insertText:@""];
}else{
NSString *substring = [tempString substringToIndex:kText_Length_MAX];
textView.text = [substring copy];
}
return NO;
}
return YES;
}
//焦点发生改变
- (void)textViewDidChangeSelection:(UITextView *)textView {
if (textView.text.length> kText_Length_MAX) {
// 超出范围的文字, 截断到规定长度
NSString * lastStr =[textView.text substringWithRange:NSMakeRange(kText_Length_MAX, 1)];
// 如果这个字符是emoji的一部分,即无效的字符,那么这个就是nil
if(lastStr.UTF8String == nil){
// 此处截断,为了杜绝掉多次deleteBackward的重复循环,减少执行效率.
NSString *substring = [textView.text substringToIndex:kText_Length_MAX + 1];
textView.text = [substring copy];
[textView deleteBackward];
}
// 上面删除一次, 如果还是超出, 再截断一次, 这里就不会有emoji了.
if (textView.text.length> kText_Length_MAX) {
NSString *substring = [textView.text substringToIndex:kText_Length_MAX];
textView.text = [substring copy];
}
}
}
网友评论