iOS中UITextView的字数限制
2016-02-17 19:25
330 查看
通常在开发中, 有些时候会碰到这样的需求: 希望输入框有最大字数限制,以及在输入文字时,提示剩余可以输入的字数。例如以下:
由于UITextField用于单行输入,今天主要介绍一下多行输入下的UITextView。
这里需要用到 通知:UITextViewTextDidChangeNotification以及代理:UITextViewDelegate。在通知中监听输入的字符串长度,在代理方法中,根据监听到的字符串长度判断textView是否能继续输入字符。
但想必大家在模拟器上测试时,用中文输入时,会遇到以下情况:
仔细观察就会发现,用中文输入时,高亮状态下的拼音也计算到字符串长度中了,导致最后几个字无法正确输入。
这个时候计算文本框字符长度时,就不能简单的使用textView.text.length了,而是要判断键盘的输入模式,如果是简体中文输入,有高亮选择的字符串,则暂不对文字进行统计和限制;没有高亮选择的字,则对已输入的文字进行字数统计和限制。
在UITextViewTextDidChangeNotification的监听方法中进行计算没有高亮选择的字符串长度:
然后在UITextViewDelegate代理方法中,判断字符长度是否达到最大限制,如果达到最大限制则禁止输入:
考虑到这个功能经常使用,可以封装一下以便以后使用,整体代码如下:
以上是iOS中UITextView的字数限制,UITextField的与此相差不大。
由于UITextField用于单行输入,今天主要介绍一下多行输入下的UITextView。
这里需要用到 通知:UITextViewTextDidChangeNotification以及代理:UITextViewDelegate。在通知中监听输入的字符串长度,在代理方法中,根据监听到的字符串长度判断textView是否能继续输入字符。
但想必大家在模拟器上测试时,用中文输入时,会遇到以下情况:
仔细观察就会发现,用中文输入时,高亮状态下的拼音也计算到字符串长度中了,导致最后几个字无法正确输入。
这个时候计算文本框字符长度时,就不能简单的使用textView.text.length了,而是要判断键盘的输入模式,如果是简体中文输入,有高亮选择的字符串,则暂不对文字进行统计和限制;没有高亮选择的字,则对已输入的文字进行字数统计和限制。
在UITextViewTextDidChangeNotification的监听方法中进行计算没有高亮选择的字符串长度:
UITextView *textView = obj.object; NSString *toBeString = textView.text; // 键盘输入模式 NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage; // 简体中文输入,包括简体拼音,健体五笔,简体手写 if ([lang isEqualToString:@"zh-Hans"]) { //获取高亮部分 UITextRange *selectedRange = [textView markedTextRange]; UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) { if (toBeString.length > kMaxLength) { textView.text = [toBeString substringToIndex:kMaxLength]; } self.res = kMaxLength-textView.text.length; self.textLable.text = [NSString stringWithFormat:@"还可以输入%ld个字", kMaxLength-textView.text.length ]; } // 有高亮选择的字符串,则暂不对文字进行统计和限制 else{ } }
然后在UITextViewDelegate代理方法中,判断字符长度是否达到最大限制,如果达到最大限制则禁止输入:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ if(self.res >= 0){ return YES; } else{ return NO; } }
考虑到这个功能经常使用,可以封装一下以便以后使用,整体代码如下:
<span style="color:#009900;">#import "ZTTextView.h"
#define kMaxLength 10
@interface ZTTextView()<UITextViewDelegate>
@property (nonatomic, strong)UILabel * textLable;
@property (nonatomic, assign)NSInteger res;
@end
@implementation ZTTextView
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor grayColor];
self.font = [UIFont systemFontOfSize:17];
self.res = kMaxLength;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textViewEditChanged:) name:UITextViewTextDidChangeNotification object:self];
self.delegate = self;
}
return self;
}
- (UILabel *)textLable{
if (_textLable == nil) {
_textLable = [[UILabel alloc]initWithFrame:CGRectMake(0, self.bounds.size.height - 30, self.bounds.size.width, 30)];
_textLable.textAlignment = NSTextAlignmentRight;
_textLable.font = [UIFont systemFontOfSize:14];
[self addSubview:_textLable];
}
return _textLable;
}
-(void)textViewEditChanged:(NSNotification *)obj{
UITextView *textView = obj.object; NSString *toBeString = textView.text; // 键盘输入模式 NSString *lang = [[UIApplication sharedApplication]textInputMode].primaryLanguage; // 简体中文输入,包括简体拼音,健体五笔,简体手写 if ([lang isEqualToString:@"zh-Hans"]) { //获取高亮部分 UITextRange *selectedRange = [textView markedTextRange]; UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) { if (toBeString.length > kMaxLength) { textView.text = [toBeString substringToIndex:kMaxLength]; } self.res = kMaxLength-textView.text.length; self.textLable.text = [NSString stringWithFormat:@"还可以输入%ld个字", kMaxLength-textView.text.length ]; } // 有高亮选择的字符串,则暂不对文字进行统计和限制 else{ } }else{
if (toBeString.length > kMaxLength) {
textView.text = [toBeString substringToIndex:kMaxLength];
}
self.textLable.text = [NSString stringWithFormat:@"还可以输入%ld个字", kMaxLength-textView.text.length];
self.res = kMaxLength-textView.text.length;
}
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{ if(self.res >= 0){ return YES; } else{ return NO; } }
@end</span>
以上是iOS中UITextView的字数限制,UITextField的与此相差不大。
相关文章推荐
- 对UIView、UIWindow和CALayer的理解
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
- Java中 map.values转换为list或者string[]
- 自己动手实现一个队列LGQueue
- ConcurrentLinkedQueue
- 优化UITableViewCell高度计算的那些事(From sunny)
- 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
- UITableView自定义cell上的按钮点击事件
- Threejs 官网 - Three.js 的图形用户界面工具(GUI Tools with Three.js)
- 36.Android之多线程和handle更新UI学习
- Incorrect string value: '/xE7/xA8/x8B/xE5/xBA/x8F...' for column 'course' at row 1
- iOS开发UI篇-懒加载、重写setter方法赋值
- [转] This Android SDK requires Android Developer Toolkit version 23.0.0 or above
- 使用CAShapeLayer与UIBezierPath画出想要的图形
- easyui获取行,js的eval函数转对象
- UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?
- 模块化--RequireJS
- 模块化--RequireJS
- sql2012增加Sequence对象
- Leetcode:Increasing Triplet Subsequence