RedRain的簡書:http://www.reibang.com/users/29e03e6ff407/latest_articles
有時(shí)需要輸入限定長度的文字?jǐn)?shù)量.但是由于鍵盤的聯(lián)想和粘貼會造成字?jǐn)?shù)超出規(guī)定數(shù).
在TextView中的代理方法處理一下超出的文字.就可以達(dá)到效果.
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)
{
// 超出范圍的文字, 截?cái)嗟揭?guī)定長度, 粘貼出現(xiàn)超出文字.
NSString *tempString = [NSString stringWithFormat:@"%@%@",textView.text,atext];
textView.text = tempString;
NSString * lastStr =[tempString substringWithRange:NSMakeRange(kText_Length_MAX, 1)];
// 如果這個(gè)字符是emoji的一部分,即無效的字符,那么這個(gè)就是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;
}
//焦點(diǎn)發(fā)生改變
- (void)textViewDidChangeSelection:(UITextView *)textView {
if (textView.text.length> kText_Length_MAX) {
// 超出范圍的文字, 截?cái)嗟揭?guī)定長度
NSString * lastStr =[textView.text substringWithRange:NSMakeRange(kText_Length_MAX, 1)];
// 如果這個(gè)字符是emoji的一部分,即無效的字符,那么這個(gè)就是nil
if(lastStr.UTF8String == nil){
// 此處截?cái)?為了杜絕掉多次deleteBackward的重復(fù)循環(huán),減少執(zhí)行效率.
NSString *substring = [textView.text substringToIndex:kText_Length_MAX + 1];
textView.text = [substring copy];
[textView deleteBackward];
}
// 上面刪除一次, 如果還是超出, 再截?cái)嘁淮? 這里就不會有emoji了.
if (textView.text.length> kText_Length_MAX) {
NSString *substring = [textView.text substringToIndex:kText_Length_MAX];
textView.text = [substring copy];
}
}
}