iOS UITextField, UITextView输入长度限制,系统自带中文输入法的Bug

起因

项目中,由于要对用户输入的文字,进行 长度限制
于是,便使用了 JHInputLimit
由于不习惯 系统自带 的输入法
所以几乎没用 系统自带 的输入法进行过测试

这就导致了潜在的 Bug 没有被发现


经过

后来,这个 Bug 还是被发现了
原因是,在其他 APP 里面,使用 系统自带中文 输入法
没有一点问题,可以连续输入
但是自己的 APP,连续输入后,却全变成了 英文

一开始,我以为是 系统输入法 的问题
是啊,难道还能 修改 系统的输入法不成?


转折

当情况变得更加奇怪时?
项目中,在 其他 地方使用 系统自带中文 输入法,没有问题!
但!就是在 这个 地方,使用 系统自带中文 输入法,就有问题!
一脸问号❓❓❓

来回切换使用各种输入法后
发现一个 区别
系统的中文输入法,会在输入的过程中,直接上屏,最后确定时才替换内容
而其他第三方输入法,输入过程中,不会上屏,最后选择时才上屏

难道是这个原因?
再加上对输入文字进行了处理?


结果

通过打断点,一步一步调试
终于确定是这个原因了!

直接上屏 的文字,进行处理后,导致 中文 变成了 英文

在自定义的监听方法内进行判断:

UITextField 变化时:

- (void)textFieldTextDidChanged:(NSNotification *)noti
{
    UITextField *textField = (UITextField *)noti.object;
    if (textField == _textField) {
        _originText = textField.text;
        
        // 进行判断处理
        [self shouldHandleText:textField type:1];
        
        if (_textFieldDidChangeTextBlock) {
            _textFieldDidChangeTextBlock(self, _textField);
        }
    }
}

UITextView 变化时:

- (void)textViewTextDidChanged:(NSNotification *)noti
{
    UITextView *textView = (UITextView *)noti.object;
    if (textView == _textView) {
        _originText = textView.text;
        
        // 进行判断处理        
        [self shouldHandleText:textView type:2];
        
        if (_textViewDidChangeTextBlock) {
            _textViewDidChangeTextBlock(self, _textView);
        }
    }
}

处理方法:

- (void)shouldHandleText:(id<UITextInput>)input type:(NSInteger)type
{
    BOOL work = YES;
    // 当前语言
    NSString *language = [[UIApplication sharedApplication] textInputMode].primaryLanguage;
    // 系统自带的中文输入法
    if ([language isEqualToString:@"zh-Hans"]) {
        // 获取高亮部分
        UITextPosition *position = [input positionFromPosition:input.markedTextRange.start offset:0];
        // 有高亮选择的文字时,不进行处理
        if (position) {
            work = NO;
        }
    }
    
    if (work) {
        // 进行处理
        NSString *text = [self handleText:_originText];
        if (![_originText isEqualToString:text]) {
            if (type == 1) {
                _textField.text = text;
            }else if (type == 2) {
                _textView.text = text;
            }
        }
    }
}

至此,完美 解决!


有点意思

我的公众号
请添加图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪冷啊

你的鼓励是对我的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值