[iOS]UITextView限制字数的写法(一)

代码前提


以下代码实现的功能

  • 限制输入框输入字数限制为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的内容长度限制

你可能感兴趣的:([iOS]UITextView限制字数的写法(一))