需求 输入框限制字数
需求下来 想参考一些资源 结果 觉得都不太能满足咱这需求 只能自己写了
想了想 需求清晰 思路也就清晰了
以下是代码
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
NSRange selection = textView.selectedRange;
NSInteger realLength = textView.text.length; //实际总长度
NSString *headText = [textView.text substringToIndex:selection.location]; //光标前的文本
NSString *tailText = [textView.text substringFromIndex:selection.location];//光标后的文本
NSInteger restLength = self.maxLength - tailText.length; //光标后允许输入的文本长度
if (realLength > self.maxLength) {
NSString *subHeadText = [headText substringToIndex:restLength];
textView.text = [subHeadText stringByAppendingString:tailText];
[textView setSelectedRange:NSMakeRange(restLength, 0)];
}
运行以上代码尝试一下 是不是觉得有问题??? 当你输中文的时候 甚至不能拼完对不对
问题是什么? 问题是字数限制问题出现了 那么解决问题就显得目标明确得多了
同事高见 显而易见的是当输入中文的时候拼音处于高亮状态
那么 高亮字符不加入字数限制就可以解决问题了 其实这么个判断
//如果在变化中是高亮部分在变,就不要计算字符了
if (selectedRange && pos) {
return;
}
于是 改善后 代码段如下
- (void)textViewDidChange:(UITextView *)textView{
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
//如果在变化中是高亮部分在变,就不要计算字符了
if (selectedRange && pos) {
return;
}
NSRange selection = textView.selectedRange;
NSInteger realLength = textView.text.length; //实际总长度
NSString *headText = [textView.text substringToIndex:selection.location]; //光标前的文本
NSString *tailText = [textView.text substringFromIndex:selection.location];//光标后的文本
NSInteger restLength = self.maxLength - tailText.length; //光标后允许输入的文本长度
if (realLength > self.maxLength) {
NSString *subHeadText = [headText substringToIndex:restLength];
textView.text = [subHeadText stringByAppendingString:tailText];
[textView setSelectedRange:NSMakeRange(restLength, 0)];
}
}