代码前提
以下代码实现的功能
- 限制输入框输入字数限制为60
- 一直保持键盘弹出的功能
#pragma mark - text view delegate
- (void)textViewDidChange:(UITextView *)textView
{
if ([textView.text length] > 60) {
textView.text = [textView.text substringWithRange:NSMakeRange(0, 60)];
[textView becomeFirstResponder];
return;
}
}
但是这样会引起crash,类似于
*** Terminating app due to uncaught exception 'NSRangeException'
reason: '*** -[NSBigMutableString substringWithRange:]: Range {60, 1} out of bounds; string length 60'
分析原因
出现crash是因为,为了实现输入的字数限制效果,会通过delegate监听输入框的UIControlEventEditingChanged事件,截取字符串,手动给输入框的text属性赋值。正常情况下输入框自己默认执行setText:,默认不会注册到自己的undoManager上,并且会清空undoManager的undo、redo栈,这样并没有问题。问题是在于监听UIControlEventEditingChanged事件所执行的方法里是先程序代码对输入框的text做截取然后执行setText:,并没有清空undoManager的undo、redo栈。
解决方案
#pragma mark - text view delegate
- (void)textViewDidChange:(UITextView *)textView
{
if ([textView.text length] > 60) {
textView.text = [textView.text substringWithRange:NSMakeRange(0, 60)];
[textView.undoManager removeAllActions];
[textView becomeFirstResponder];
return;
}
}
第二篇:
[iOS]iOS7系统下multistage text input(中文输入法)下UITextView的内容长度限制