iOS中UITextView的字数限制

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


由于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的与此相差不大。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值