[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的内容长度限制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容