iOS UITextField, UITextView输入长度限制,系统自带中文输入法的Bug
原创
©著作权归作者所有:来自51CTO博客作者haocold的原创作品,请联系作者获取转载授权,否则将追究法律责任
起因
项目中,由于要对用户输入的文字,进行 长度限制
于是,便使用了 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;
}
}
}
}
至此,完美
解决!
有点意思
我的公众号