您的位置:首页 > 产品设计 > UI/UE

iOS中UITextView的字数限制

2016-02-17 19:25 330 查看
通常在开发中, 有些时候会碰到这样的需求: 希望输入框有最大字数限制,以及在输入文字时,提示剩余可以输入的字数。例如以下:



由于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的与此相差不大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: