iOS textView限制文字输入(完整版)
2018-07-30 本文已影响111人
geekAppke
- iOS - UITextView在调用textViewDidChange方法,九宫格相关中文输入的问题
- iOS 文本输入框限制输入字数【组件】
- 目前最好的截断方式iOS UITextView 限制字数
- 解决中间输入、粘贴
- 中文输入,拼音联想
- 最后输入,拼音联想不能输入的问题!
- 超过长度不能删除问题
- 截断半个emoji问题iOS 限制输入emoji完美解决方案
- 回车退出输入
- 摇一摇能触发undo操作;撤销粘贴,直接奔溃问题
- 当我复制粘贴一长段文字(大于textfield限制输入的最大长度)后, 通过iPhone摇一摇 弹出撤销弹框 点击撤销崩溃 错误原因如下:
-[NSBigMutableString substringWithRange:]: Range {0, 43} out of bounds; string length 8 - Strange crash in UITextview undo on iOS 7
- iOS9 textField undo/redo 崩溃
- iOS-NSUndoManager与怎样弄崩微信
- 看起来是截取的操作会入undo栈,之后的setText:方法并不会清空undo栈,导致做undo操作时,逆操作的是字符串截取的操作,操作的数据对不上,导致崩溃,这是我觉得比较合理的解释。
- 当我复制粘贴一长段文字(大于textfield限制输入的最大长度)后, 通过iPhone摇一摇 弹出撤销弹框 点击撤销崩溃 错误原因如下:
- 数字提示label固定,y值加一个
self.contentOffset.y;
解决的问题:
1.截断汉字对中文输入不友好的问题(比如要输入最后一个汉字“哈”,输入字母h之后就不让你输入了。注:在系统自带键盘中文会出现这个问题)
2.我已经输入满了,此时光标放在文字中间,再输入就会顶掉后面的字。需求当然是删掉你正在输入的字,已完美解决。
#pragma mark - Protocol conformance
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) { // 输入回车
[textView resignFirstResponder];
return NO;
}
return YES;
}
- (void)textViewDidChange:(UITextView *)textView {
self.placeholderLabel.hidden = textView.hasText;
UITextRange *selectedRange = [textView markedTextRange];
// 获取高亮部分 中文联想
UITextPosition *posi = [textView positionFromPosition:selectedRange.start offset:0];
// 如果在变化中是高亮部分在变,就不要计算字符
if (selectedRange && posi) {
return;
}
// 实际总长度
NSInteger realLength = textView.text.length;
NSRange selection = textView.selectedRange;
NSString *headText = [textView.text substringToIndex:selection.location]; // 光标前的文本
NSString *tailText = [textView.text substringFromIndex:selection.location]; // 光标后的文本
NSInteger restLength = self.limitNum - tailText.length; // 光标前允许输入的最大数量
if (realLength > self.limitNum) {
// 解决半个emoji 定位到index位置时,返回在此位置的完整字符的range
NSRange range = [textView.text rangeOfComposedCharacterSequenceAtIndex:restLength];
NSString *subHeadText = [textView.text substringToIndex:range.location];
// NSString *subHeadText = [headText substringToIndex:restLength];
textView.text = [subHeadText stringByAppendingString:tailText];
[textView setSelectedRange:NSMakeRange(restLength, 0)];
// 解决粘贴过多之后,撤销粘贴 崩溃问题 —— 不会出现弹框
[textView.undoManager removeAllActions];
}
self.textNumLabel.text = [NSString stringWithFormat:@"%ld/%ld", textView.text.length, self.limitNum];
}