起因

项目中,由于要对用户输入的文字,进行 ​​长度限制​​​ 于是,便使用了 ​​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;
}
}
}
}

至此,​​完美​​ 解决!


有点意思

我的公众号


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