关于TextView限制长度的中英文混合输入

  TextView的输入限制长度的时候,会出现一些小问题,如果不特别注意的话,不会有太大问题,但是如果要求高的话,这就不能放过了。假设一种情况,最大输入长度为25个字符,当我们已经输入24个字符的时候,想要输入一个“五”字,不做处理的话,输入一个"w"的时候,再输入"u"的时候,就会提示达到最大输入长度了,这是不符合我们要求的,这就是中英文输入的一个坑。

由于再输入的时候,TextView是统计备选框中英文字母的个数的,这样导致我们想要的效果达不到。

以下是一种处理方式

1.先添加一个观察者

1 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeMode:) name:@"UITextInputCurrentInputModeDidChangeNotification" object:nil];

2.实现观察者的方法,切换输入法,显示当前的输入法

-(void) changeMode:(NSNotification *)notification{
    NSLog(@"%@",[[UITextInputMode currentInputMode] primaryLanguage]);
}

输出结果

2016-01-22 11:04:20.966 TextView[1149:41370] zh-Hans 中文

2016-01-22 11:04:29.765 TextView[1149:41370] en-US   英文

2016-01-22 11:04:33.400 TextView[1149:41370] emoji   表情


3.实现TextView的代理方法

- (void)textViewDidChange:(UITextView *)textView
{
//    UITextInputMode *mode = [[UITextInputMode activeInputModes] firstObject];
    NSString *lang = [[UITextInputMode currentInputMode] primaryLanguage];//当前的输入模式
    if ([lang isEqualToString:@"zh-Hans"])
    {
        //        如果输入有中文,且没有出现文字备选框就对字数统计和限制
        //        出现了备选框就暂不统计
        UITextRange *range = [textView markedTextRange];
        
        UITextPosition *position = [textView positionFromPosition:range.start offset:0];
        if (!position)
        {
            [self checkText:textView];
        }
    }
    else
    {
        [self checkText:textView];
    }
}

4.判断

- (void)checkText:(UITextView *)textView
{
    NSString *string = textView.text;
    
    if (string.length > kMaxLength)
    {
        
        UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"最多输入25个字符" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction * action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
        [alert addAction:action];
        [self presentViewController:alert animated:YES completion:nil];
        
        textView.text = [string substringToIndex:kMaxLength];
    }
    
    NSInteger length = textView.text.length;
    NSInteger num = kMaxLength - length;
    num = MAX(num, 0);

}

  

实现效果

此方法也可以用于TextField

 

 

 

转载于:https://www.cnblogs.com/easyfly/p/5150804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值